[英]setting elements of a structure to random double values using an array of pointers to the structure
我正在嘗試創建一個指向程序運行結構的指針數組,但是它只是說“分段錯誤: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;
}
為了論證的目的,讓我們忽略 struct alignment 並假設一個目標(例如 x86),其中:
sizeof(double) == 8
和sizeof(int) == 4
。
現在,您正在分配一個大小為 16 字節的 memory 塊:
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));
, 為您的結構分配適當的空間量。
編輯:如果您打算在其他地方使用分配的數據,則應刪除對free
的調用,而是在程序中完成數據后釋放數據。 下一行的return
語句也可能是一個錯誤,因為它在第一次迭代時退出循環,這很可能不是你想要的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.