gpt4 book ai didi

c - 结构变量初始化的问题

转载 作者:行者123 更新时间:2023-11-30 14:37:46 25 4
gpt4 key购买 nike

由于某种原因,我的结构变量无法可靠地保存其值

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

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,打印语句也会给我一些看起来像内存地址的东西。奇怪的是,如果我尝试 newE1,它确实给出 0。如果我在此函数中手动分配它 0,它也会给我 0。如果我在单独的函数中手动分配它 0(在 initEdge(...) 中完成),它不会打印 0。

最佳答案

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

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 替换的情况下,这更具弹性。

关于c - 结构变量初始化的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57041879/

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