gpt4 book ai didi

c - 初始化结构数组奇怪的行为

转载 作者:太空宇宙 更新时间:2023-11-04 01:54:07 25 4
gpt4 key购买 nike

我正在使用一个结构数组,然后像下面这样设置元素:

#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;
}

注意:这不是实际代码(太大而无法发布),但数组和结构 的设置是相同的。

如您所见,我将每个 vehicle[i].s 设置为空格字符,但循环打印以下内容(不是此示例代码,而是在我的实际代码中):

: x=32215344 y=0
P: x=0 y=33
: x=2105376 y=0

问题:怎么会在第一次循环后,在“后台”修改了一些元素,而没有在代码中赋值呢?或者其他一些 malloc 操作可以覆盖/重新分配内存吗?

最佳答案

问题,如我所见

 vehicle = malloc(26*sizeof(point*));

您正在为指向数据类型的指针类型分配内存,而您应该为数据类型本身分配内存。

具体来说,您要为 point 类型的 26 个元素(即 struct _point)分配内存,不是 26 点 *.

改变

vehicle = malloc(26*sizeof(point));

或者,为了更好,

vehicle = malloc(26*sizeof * vehicle);

否则,当您尝试解引用指针以访问 n 个实例时,分配的内存不足。因此,您最终访问了导致 undefined behavior 的越界内存。 .

也就是说,只是一个建议,如果您事先知道要分配的大小(例如26),请不要使用动态内存,没有必要。使用数组。

关于c - 初始化结构数组奇怪的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37523333/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com