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ため、2 番目のコードが正常に機能する場合、最初のコードはなぜ機能しないのでしょうか? *S最初のコードは 2 番目のコードと同等ですが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 に答える