使用指向结构的指针数组将结构的元素设置为随机双精度值
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) == 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),如上所述。
您很可能想将分配更改为 stars[i] = malloc(sizeof(Star));
,以便为您的结构分配适当数量的 space。
编辑:
如果您计划在其他地方使用分配的数据,您应该删除对 free
的调用,并在您的程序中完成后释放数据。下一行中的 return
语句也可能是一个错误,因为它在第一次迭代时退出循环,这很可能不是您想要的。
我正在尝试制作一个指向结构的指针数组 程序运行,但它只是说 '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) == 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),如上所述。
您很可能想将分配更改为 stars[i] = malloc(sizeof(Star));
,以便为您的结构分配适当数量的 space。
编辑:
如果您计划在其他地方使用分配的数据,您应该删除对 free
的调用,并在您的程序中完成后释放数据。下一行中的 return
语句也可能是一个错误,因为它在第一次迭代时退出循环,这很可能不是您想要的。