首页 > 解决方案 > 使用指向结构的指针数组将结构的元素设置为随机双精度值

问题描述

我正在尝试创建一个指向程序运行结构的指针数组,但是它只是说“分段错误:11”任何帮助将不胜感激

typedef struct
{
  int id;
  double x;
  double y;
  char name[30];
  int named;
} Star;


Star *stars[10];


int bang (int n_stars)
{
  if ((n_stars >= 1) && (n_stars <= 10))
{
    for (int i = 0; i < n_stars; i++)
    {
      double x = rand() % 10;
      double y = rand() % 10;
      stars[i] = (Star*) malloc(sizeof(x) + sizeof(y));
      stars[i]->x = x;
      stars[i]->y = y;
      free(stars[i]);
      return 1;
    }
}
else
{
    return 0;
}
return 0;
}

标签: csegmentation-fault

解决方案


为了论证的目的,让我们忽略结构对齐并假设一个目标(例如 x86),其中:

sizeof(double) == 8, 和sizeof(int) == 4.

现在,您正在分配一个大小为 16 字节的内存块:

stars[i] = (Star*) malloc(sizeof(x) + sizeof(y));

结构体的定义是:

typedef struct
{
  int id;
  double x;
  double y;
  char name[30];
  int named;
} Star;

注意 的偏移量y是 12 个字节。当你执行:

stars[i]->y = y;

的值y被写入地址&stars[i]+ 12 个字节。Double 占用 8 个字节,这将溢出您的分配 (12+8 > 16),如上所述。

您很可能希望将 allication 更改为stars[i] = malloc(sizeof(Star));, 为您的结构分配适当数量的空间。

编辑:如果您打算在其他地方使用分配的数据,则应删除对 的调用free,而是在程序中完成数据后释放数据。下一行的return语句也可能是错误的,因为它在第一次迭代时退出循环,这很可能不是您想要的。


推荐阅读