c - 使用指向结构的指针数组将结构的元素设置为随机双精度值
问题描述
我正在尝试创建一个指向程序运行结构的指针数组,但是它只是说“分段错误: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),如上所述。
您很可能希望将 allication 更改为stars[i] = malloc(sizeof(Star));
, 为您的结构分配适当数量的空间。
编辑:如果您打算在其他地方使用分配的数据,则应删除对 的调用free
,而是在程序中完成数据后释放数据。下一行的return
语句也可能是错误的,因为它在第一次迭代时退出循环,这很可能不是您想要的。
推荐阅读
- c++ - 错误:字符串之前的预期主表达式
- c++ - 如何在 C++ 中使用 unsigned char 数组创建 streambuf
- math - 如何计算箭头填充时钟所有给定扇区所需的步数?
- c# - 如何使用 C# 进行 OAuth 1 Twitter API 调用(dotnet core 3.1)
- python - 从Python中的excel文件填充空单元格并重命名多索引标题的列名
- c# - 有没有办法代替双重不冻结项目,而是说无效号码?
- html - 为什么不使用最高的 z-index 允许我的图标覆盖应该在它下面的 div 但它不会?
- gremlin - 通过另一个顶点查询顶点 [GREMLIN]
- json-api - 日期字符串作为 json-api 中的 id
- c - CS50 替换,检查重复项和检查所有字符是否为字母的问题