Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 结构变量初始化问题_C_Struct - Fatal编程技术网

C 结构变量初始化问题

C 结构变量初始化问题,c,struct,C,Struct,由于某些原因,我的结构变量不能可靠地保存其值 我尝试了指定的初始值设定项,并在单独的函数中“手动”执行。奇怪的是,它对一个变量有效,但对另一个变量无效 struct三角形; 结构顶点{ int标签; 双x; 双y; int isBorder;//如果不是0,则为1 }; 结构边{ 结构顶点*a; 结构顶点*b; 结构三角形*三角形1; 结构三角形*三角形2; 国际精炼商; int isBorder;//0为假,1为真 int isOdd;//0为假;1为真 }; 结构三角形{ 结构顶点*顶点1;

由于某些原因,我的结构变量不能可靠地保存其值

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

struct三角形;
结构顶点{
int标签;
双x;
双y;
int isBorder;//如果不是0,则为1
};
结构边{
结构顶点*a;
结构顶点*b;
结构三角形*三角形1;
结构三角形*三角形2;
国际精炼商;
int isBorder;//0为假,1为真
int isOdd;//0为假;1为真
};
结构三角形{
结构顶点*顶点1;
结构顶点*顶点2;
结构顶点*顶点3;
结构边缘*edge1;
结构边缘*边缘2;
结构边缘*edge3;
结构三角形*邻域1;
结构三角形*邻域2;
结构三角形*邻域3;
int-type;//0-偶数/a;1-奇数/b
};

结构边*newE1,*newE2={0},*newE3;
newE1=malloc(sizeof(newE1));
newE2=malloc(sizeof(newE2));
newE3=malloc(sizeof(newE3));
*newE1=(结构边){v1,com,NULL,NULL,refinementOrder+1,0,0};
*newE2=(结构边){v2,com,NULL,NULL,refinementOrder+1,0,0};
//initEdge(newE2、v2、com、refinementOrder+1);
*newE3=(结构边){v3,com,NULL,NULL,refinementOrder+1,0,0};
//newE2->isBorder=0;
printf(“%d\n”,newE2->isBorder);

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

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

newE1 = malloc(sizeof(newE1));
newE2 = malloc(sizeof(newE2));
newE3 = malloc(sizeof(newE3));
变量
newE1
是一个指针,因此
sizeof(newE1)
给出的是指针的大小,而不是它所指向的大小(对于
newE2
newE3
),指针的大小通常为4或8字节,因此这很可能小于结构的大小

因此,当您尝试写入结构的特定成员时,您将写入超过分配的内存块的末尾

要分配适当的内存量,请执行以下操作:

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

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

这只是错误的malloc-ing。我是在为指针而不是结构malloc-ing空间


使用
malloc(sizeof(*newE1))
修复了问题。

sizeof(newE1)
是指针的大小。试试
newE2=malloc(sizeof(struct edge));
取而代之的是@Blaze或
sizeof(*newE1)
struct edge*newE1、*newE2={0}、*newE3;
只是,为什么?sizeof(*newE1)确实修复了它……非常感谢!