IはCでperror関数をテストしていて、ヌルポインタが渡されたときにthis pageによれば、デフォルトのメッセージを出力:なぜperror関数を試したときに私のプログラムがクラッシュしたのですか?
int main(void)
{
int *p;
perror(p); //crashes
}
IはCでperror関数をテストしていて、ヌルポインタが渡されたときにthis pageによれば、デフォルトのメッセージを出力:なぜperror関数を試したときに私のプログラムがクラッシュしたのですか?
int main(void)
{
int *p;
perror(p); //crashes
}
原因int* p
ランダム/ごみ値を含みます。
NULL
ポインタではありません。明示的にそれをp = NULL;
で初期化する必要があります。
未初期化変数の使用は未定義の動作です。
main()
もreturn 0;
にする必要があります。
p
はCでは自動的に0に初期化されないため(これはJavaではありません)。
int *p = 0;
perror
への無効なポインタを渡すことは、未定義の動作です。明示的に以下の詳細な説明では特に断りのない限り
(C99、7.1.4p1)「次の文は、それぞれが適用されます。関数の引数は、そのようなドメイン外の値として無効な値を(持っている場合関数、またはプログラムのアドレス空間外のポインタ、ヌルポインタ、または対応する パラメータがconst修飾されていない場合の変更不可能なストレージへのポインタ)、または関数によって期待されない型(昇格後)引数の数が可変の の場合、動作は未定義です。
どのようにリファレンスソースをすばやく見つけることができますか?ありがとう! – Coffee
about: '7.19.10.4-2':' 's'がヌルポインタではなく、' s'が指す文字がヌル文字*でない場合。 – cnicutar
@cnicutar私は、 "未定義の振る舞いはこの言葉で"未定義の振る舞い "という言葉や振る舞いの明示的な定義を省略して、この規格で別途指示されていると言っています。" – ouah