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

时间:2016-05-30 10:25:30

标签: c arrays struct malloc

我正在使用一组结构,然后设置如下的元素:

#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操作是否可以覆盖/重新分配内存?

1 个答案:

答案 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),不要使用动态内存,不需要它。使用数组。