struct x {
int *u;
};
struct y {
struct x *z;
};
int main()
{
static y b;
static int g=7;
b.z->u=&g;
}
语句b.z->u=&g
给出了分段错误。如果我删除static
前面的int g
:
int g=7;
b.z->u=&g;
代码正确执行。
答案 0 :(得分:2)
因为b.z
尚未设置为指向任何有用的位置。它目前只是一个NULL
指针。 *
你需要做一些事情:
b.z = malloc(sizeof(*b.z));
首先(即创建一个实际对象)。
请记住free
这一点。
*请注意,它仅为NULL
,因为b
被声明为static
。如果b
为非static
,则会指向内存中的随机位置。
答案 1 :(得分:2)
b.z
尚未初始化。您使用以下内容初始化b
static y b;
但其成员字段z
仍然是一个空指针(指向一些随机位置)。因此,当您访问某些随机内存时,访问其成员u
会导致分段错误。
我认为这样的事情应该有用(没试过):
static y b;
static x c;
static int g=7;
b.z = &c;
b.z->u=&g;
为什么你的第二个例子有效,我不知道。我怀疑这是因为'运气'......
答案 2 :(得分:1)
它会给你一个分段错误,因为你正在做的是未定义的行为。您正在访问结构的z
指针,而无需对其进行初始化(即,不给它指向的内存空间)。在变量不是静态的情况下它没有给你一个分段错误的事实并不重要,因为对未初始化指针的整个访问是错误的。
答案 3 :(得分:1)
您从未为b.z
分配内存。您的b.z
包含未初始化的垃圾值,这就是尝试取消引用b.z
(在b.z->u
中)导致细分错误的原因。
P.S。您声明了对象static
,这意味着b.z
最初包含一个空值(而不是如上所述的“未初始化的垃圾值”)。然而,取消引用空指针也是未定义的。