C 使用-&燃气轮机&引用;而不是"&引用;访问结构会导致分段错误

C 使用-&燃气轮机&引用;而不是"&引用;访问结构会导致分段错误,c,pointers,C,Pointers,我在somefile.h中创建了一个typedef结构,并在somefile.c中声明为 somestruct *mystruct; 并作为 somevar = mystruct->variable; 然后它产生“分段错误”(可能是堆栈溢出,因为存在“while”循环)。 但如果我把它当作 somestruct mystruct; somevar = mystruct.variable; 那没问题 有什么不对??somestruct*mystruct定义了一个指向类型为somestr

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

somestruct *mystruct;
并作为

somevar = mystruct->variable;
然后它产生“分段错误”(可能是堆栈溢出,因为存在“while”循环)。 但如果我把它当作

somestruct mystruct;
somevar = mystruct.variable;
那没问题


有什么不对??

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

如果这样做
somestruct mystruct
,则定义结构本身,而不是指针(内存中存在对象)

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

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

如果以下情况产生segfault:

somestruct *mystruct;
somevar = mystruct->variable;
这可能是所有的代码。第一行仅定义指向
somestruct
指针。指针未初始化,它指向某个未定义的位置。没有类型为
somestruct
的实际对象

取消引用此指针是未定义的行为——您的程序将尝试从某个未知位置读/写,操作系统可能会捕捉到这一点,并使用分段错误终止您的程序

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

somestruct foo;
somestruct *mystruct = &foo;
somevar = mystruct->variable;
如果要创建新的
somestruct
,可以执行动态分配(包括
stdlib.h
):

您是否为
*mystruct
分配过内存?指针只是一个指针,不会自动附加任何对象。。。
somestruct *mystruct = malloc(sizeof(*mystruct));
// use *mystruct
// when done, don't forget:
free(mystruct);