通过嵌套结构访问指针

时间:2011-09-16 18:35:33

标签: c pointers static structure

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;  

代码正确执行。

4 个答案:

答案 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最初包含一个空值(而不是如上所述的“未初始化的垃圾值”)。然而,取消引用空指针也是未定义的。