我正在使用一组结构,然后设置如下的元素:
#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
问题:在第一个循环之后,如何在&#34;背景&#34;中修改一些元素。没有在代码中分配它们?或者其他一些malloc操作是否可以覆盖/重新分配内存?
答案 0 :(得分:3)
问题,我认为是在
vehicle = malloc(26*sizeof(point*));
您正在为指向数据类型的类型分配内存,而您应该为数据类型本身进行分配。
详细说明,您希望为类型为point
的26个元素(即struct _point
),不 26 point *
分配内存。
更改
vehicle = malloc(26*sizeof(point));
或者,为了更好,
vehicle = malloc(26*sizeof * vehicle);
否则,当您尝试取消引用访问n
实例的指针时,您将缺少已分配的内存。因此,您最终会访问导致undefined behavior的超出内存。
那就是说,只是一个建议,如果你知道事先分配的大小,(例如26
),不要使用动态内存,不需要它。使用数组。