由于某种原因,我的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。
答案 0 :(得分:1)
您没有为结构分配足够的空间:
newE1 = malloc(sizeof(newE1));
newE2 = malloc(sizeof(newE2));
newE3 = malloc(sizeof(newE3));
变量newE1
是一个指针,因此sizeof(newE1)
为您提供了指针的大小,而不是指针指向的大小(与newE2
和newE3
相同) 。指针的大小通常为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))
解决了问题。