我在somefile.h中创建了一个typedef结构,并在somefile.c中声明为
somestruct *mystruct;
并以
的形式访问somevar = mystruct->variable;
然后它产生“分段错误”(可能是StackOverflow,因为有一个“while”循环)。 但如果我用它作为
somestruct mystruct;
somevar = mystruct.variable;
然后没问题。
怎么了?
答案 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);