使用“ - >”代替 ”。”访问结构给出了分段错误

时间:2017-06-29 08:53:17

标签: c pointers

我在somefile.h中创建了一个typedef结构,并在somefile.c中声明为

somestruct *mystruct;

并以

的形式访问
somevar = mystruct->variable;

然后它产生“分段错误”(可能是StackOverflow,因为有一个“while”循环)。 但如果我用它作为

somestruct mystruct;
somevar = mystruct.variable;

然后没问题。

怎么了?

2 个答案:

答案 0 :(得分:4)

somestruct *mystruct定义了一个指向类型somestruct的内存的指针并且没有指向任何东西,或者如果它是局部变量则更好,那么它没有被初始化,这是未定义的行为

如果你这样做somestruct mystruct那么你定义struct本身而不是指针(对象存在于内存中)。

要使用指针访问,您应为结构保留内存,如:

somestruct *mystruct = malloc(sizeof(*mystruct));
mystruct->variable = 5;

或者您也可以这样做:

somestruct mystruct; //Create my structure in memory
somestruct *mystruct_ptr = &mystruct; //Create pointer to that structure and assign address
mystruct_ptr->variable = 10; //Write to mystruct using pointer access

答案 1 :(得分:0)

如果以下内容产生了段错误:

somestruct *mystruct;
somevar = mystruct->variable;

可能是所有代码。第一行只是将指针定义为somestruct。指针未初始化,指向某个未定义的位置。没有somestruct类型的实际对象。

取消引用此指针是未定义的行为 - 您的程序将尝试读取/写入某个未知位置,操作系统可能会捕获此指针并使用分段错误

要实际使用指针,它必须指向某个对象。如果你某处有somestruct,你可以指向指针:

somestruct foo;
somestruct *mystruct = &foo;
somevar = mystruct->variable;

如果您想创建新的somestruct,您可以进行动态分配(包括stdlib.h):

somestruct *mystruct = malloc(sizeof(*mystruct));
// use *mystruct
// when done, don't forget:
free(mystruct);