使用C/Linux指针到指针的分段错误

Ori*_*ski 3 c pointers segmentation-fault

在下面的代码中我得到一个分段错误:

Set *getpar() {...}

char function(...) 
{
   Set **S;
   *S = getpar(); /* Segmentation Fault */
   ...
}
Run Code Online (Sandbox Code Playgroud)

但奇怪的是,几乎没有变化就没有分段错误:

Set *getpar() {...}
...
char function(...) 
{
   Set *S;       // One less '*'
   S = getpar(); // One less '*'
   ...
}
Run Code Online (Sandbox Code Playgroud)

据我所知,如果有一个' Set **S'那么*S是指向一个Set对象的指针,所以如果第二个代码工作正常,为什么不应该第一个?*S第一个代码相当于S第二个代码,我不对吗?我该如何解决这个问题?

Ben*_*ins 9

Set**S未启动,但您在下一个语句中取消引用S:

*S =无论如何

除非你得到真正的,非常不幸的并且S指向你可以实际访问的内存位置,否则你试图取消引用无效指针.

您需要先分配指针:

Set **S;
S = (S**)calloc(sizeof(S*),1);
*S = getpar();
Run Code Online (Sandbox Code Playgroud)

或者,或者(我认为最好):

Set *S;
Set **T = &S;

S = getpar();

/* whatever else */
Run Code Online (Sandbox Code Playgroud)