[英]Initializing array of structs strange behavior
我正在使用一組結構,然后設置如下的元素:
#include <stdio.h>
#include <stdlib.h>
typedef struct _point {
char s;
unsigned int x;
unsigned int y;
} point;
point* vehicle;
int main(int argc, char *argv[]) {
/* 26 Vehicles */
vehicle = malloc(26*sizeof(point*));
for (int i = 0; i < 26; i++) {
vehicle[i].s = ' ';
}
/* Print already existing vehicles */
for (int i = 0; i < 26; i++) {
if (vehicle[i].s != ' ') {
printf("%c: x=%d y=%d\n", vehicle[i].s, vehicle[i].x, vehicle[i].y);
}
}
return 0;
}
注意 :這不是實際的代碼(它太大而不能發布)但是數組和structs
是相同的。
正如您所看到的,我將每個vehicle[i].s
設置為空格字符,但循環打印以下內容(不是此示例代碼,而是在我的實際代碼中):
: x=32215344 y=0 P: x=0 y=33 : x=2105376 y=0
問題 :在第一個循環之后,如何在“背景”中修改某些元素而不在代碼中分配它們? 或者其他一些malloc操作可以覆蓋/重新分配內存嗎?
問題,正如我所看到的那樣
vehicle = malloc(26*sizeof(point*));
你是為指向數據類型的類型分配內存,而你應該為數據類型本身分配。
詳細說明,你想為26個point
類型元素(即struct _point
)分配內存, 而不是 26 point *
。
更改
vehicle = malloc(26*sizeof(point));
或者,為了更好,
vehicle = malloc(26*sizeof * vehicle);
否則,當您嘗試dererference的指針來訪問你正在運行的短分配內存的n
實例秒。 因此,您最終會訪問導致未定義行為的超出內存。
也就是說,只是一個建議,如果你知道預先分配的大小,(例如26
),不要使用動態內存,不需要它。 使用數組。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.