簡體   English   中英

使用指向結構的指針數組將結構的元素設置為隨機雙精度值

[英]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) == 8sizeof(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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM