C言語関係掲示板

過去ログ

No.1103 ポインタの参照先の有無を判別する方法

[戻る] [ホームページ]
No.1506

ポインタの参照先の有無を判別する方法。
投稿者---次郎丸(2004/03/24 09:57:29)


ポインタについての質問です。

int func(structed *stc);

関数宣言が上のような形になる、
構造体のポインタを引数とする関数を作っています。

その関数は、渡されたポインタの参照先の構造体を操作するため、
もし、呼び出し元が構造体のポインタだけ宣言して、その参照先の構造体のアドレスを代入せずに引数として渡してくると、セグメンテーション違反を起こして停止する事になります。

そこで、関数の側で、渡された引数のポインタが、ちゃんと参照先の構造体を持っているかどうか判別して、
持っていなければ、呼び出し元に操作を戻す機能を持たせたいのですが、
その判別の方法がわかりません。

ひょっとしたら、C言語では構造的に無理なのでしょうか?
判別する方法をご存知の方がいらっしゃったら、ぜひ教えてください。


No.1507

Re:ポインタの参照先の有無を判別する方法。
投稿者---samsara(2004/03/24 11:08:30)


引数のポインタがNULLかどうかチェックする
ぐらいでしょう。

int func(structed *stc)
{
if(stc == NULL)
{
/*エラー処理*/
}
else
{
/*正常処理*/
}
}

たとえば
structed* ptr;
func(ptr);
とポインタを初期化しないで引数に渡した場合には、
ptrがどこを指しているのか定かではありません。
この場合にはおそらく不具合になり、func関数を呼び
出す方できちんとポインタを管理しないといけないですね。

ポインタは無効な場合にはNULLにしておきましょう。



No.1508

Re:ポインタの参照先の有無を判別する方法。
投稿者---YuO(2004/03/24 11:17:46)


>そこで、関数の側で、渡された引数のポインタが、ちゃんと参照先の構造体を持っているかどうか判別して、
>持っていなければ、呼び出し元に操作を戻す機能を持たせたいのですが、
>その判別の方法がわかりません。
>ひょっとしたら、C言語では構造的に無理なのでしょうか?

無理です。
オブジェクトを参照していないことを意味するために空ポインタがあるわけですし……。

ポインタ引数が存在する場合,
無効なポインタを渡さないことが呼び出し側の責務です。


No.1510

ご返答ありがとうございます。
投稿者---次郎丸(2004/03/24 13:02:16)


samsaraさん、YuOさん、ご返答ありがとうございます。

残念ながら判別方法はないようですね。
ご指摘にあったように、
NULLかどうかのif文を加えて少しでも安全性を上げることにします。

ご教示ありがとうございました。