结构变量初始化问题

时间:2019-07-15 14:26:46

标签: c struct

由于某种原因,我的struct变量不能可靠地保存其值

我尝试了指定的初始值设定项,并在单独的函数中“手动”执行。奇怪的是,它适用于一个变量,但不适用于另一个变量。

struct triangle;

struct vertex{
    int tag;
    double x;
    double y;
    int isBorder; //0 if it isn't, 1 if it is
};

struct edge{
    struct vertex *a;
    struct vertex *b;
    struct triangle *triangle1;
    struct triangle *triangle2;
    int refinementOrder;
    int isBorder; // 0 false, 1 true
    int isOdd; //0 false; 1 true

};

struct triangle{ 
    struct vertex *vertex1;
    struct vertex *vertex2;
    struct vertex *vertex3;
    struct edge *edge1;
    struct edge *edge2;
    struct edge *edge3;
    struct triangle *neighbour1;
    struct triangle *neighbour2;
    struct triangle *neighbour3;
    int type; //0 - even/a ; 1 - odd/b
};

struct edge *newE1, *newE2 = {0}, *newE3;

newE1 = malloc(sizeof(newE1));
newE2 = malloc(sizeof(newE2));
newE3 = malloc(sizeof(newE3));

*newE1 = (struct edge) {v1, com, NULL, NULL, refinementOrder+1, 0, 0};
*newE2 = (struct edge) {v2, com, NULL, NULL, refinementOrder+1, 0, 0};
//initEdge(newE2, v2, com, refinementOrder+1);
*newE3 = (struct edge) {v3, com, NULL, NULL, refinementOrder+1, 0, 0};
//newE2->isBorder = 0;
printf("%d\n", newE2->isBorder);

即使我在isBorder中用0初始化了newE2,print语句也给了我一些看起来像内存地址的东西。奇怪的是,如果我尝试newE1,它的确给出0。如果我在此函数中手动将其分配为0,它也会给我0。如果我在单独的函数中手动将其分配为0(在initEdge(...)中完成,则不会输出0。

2 个答案:

答案 0 :(得分:1)

您没有为结构分配足够的空间:

newE1 = malloc(sizeof(newE1));
newE2 = malloc(sizeof(newE2));
newE3 = malloc(sizeof(newE3));

变量newE1是一个指针,因此sizeof(newE1)为您提供了指针的大小,而不是指针指向的大小(与newE2newE3相同) 。指针的大小通常为4或8个字节,因此最有可能小于结构的大小。

结果,当您尝试写入该结构的特定成员时,您将写入分配的内存块末尾。这将调用undefined behavior

要分配适当的内存量:

newE1 = malloc(sizeof(*newE1));
newE2 = malloc(sizeof(*newE2));
newE3 = malloc(sizeof(*newE3));

还请注意使用sizeof(*newE1)而不是sizeof(struct edge),因为在结构名称更改或用typedef替换时,这种方法更具弹性。

答案 1 :(得分:0)

这真是不好的分配。我正在为指针而不是结构分配空间。

使用malloc(sizeof(*newE1))解决了问题。