使用指向结构的指针数组将结构的元素设置为随机双精度值

setting elements of a structure to random double values using an array of pointers to the structure

我正在尝试制作一个指向结构的指针数组 程序运行,但它只是说 'Segmentation fault: 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;
}

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

sizeof(double) == 8sizeof(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),如上所述。

您很可能想将分配更改为 stars[i] = malloc(sizeof(Star));,以便为您的结构分配适当数量的 space。

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