3

在以下代码中,我遇到了分段错误:

Set *getpar() {...}

char function(...) 
{
   Set **S;
   *S = getpar(); /* Segmentation Fault */
   ...
}

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

Set *getpar() {...}
...
char function(...) 
{
   Set *S;       // One less '*'
   S = getpar(); // One less '*'
   ...
}

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

4

2 回答 2

10

Set **S 未初始化,但您在下一条语句中取消引用 S:

*S = 随便

除非您真的非常不走运并且 S 指向您可以实际访问的内存位置,否则您正在尝试取消引用无效指针。

您需要先分配指针:

Set **S;
S = (S**)calloc(sizeof(S*),1);
*S = getpar();

或者,或者(我认为更可取):

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

S = getpar();

/* whatever else */
于 2009-04-25T22:24:15.050 回答
0

**S 未初始化。它没有指向任何东西(垃圾),然后你在下一个语句中取消引用它。

于 2009-04-26T16:23:31.897 回答