ここで「こんにちは」がどのように印刷されているか教えてください。私の知る限り、ローカル変数は初期化されていません。したがって、else部分を印刷する必要があると思いましたが、そうではありません。助けてください。
struct buss{
int a;
char b;
};
void main(){
struct buss *p;
if(p==NULL) printf("hello");
else printf("hi");
}
p
オブジェクトを初期化していません。その値は不定です。
初期化されていないオブジェクトの読み取りは未定義の動作です。未定義の動作は、何でも起こり得ることを意味します。何でもあなたのプログラムがクラッシュしたり印刷したりする可能性があることを意味します"nose demons"
.
編集:コメントで要求されているように、「初期化されていないオブジェクトを常に未定義の動作で読み取りますか?」という質問に対して: C90 の場合は、未定義動作の定義の 3.16 を参照してください。C11 の場合は 6.3.2.1p2 を参照し、C99 の場合は C を参照してください。DR#338の委員会の回答。
p
は初期化されていないポインターであり、どこかを指しており、たまたまそうNULL
であるため、出力"hello"
されます。@Ouah は、アクセスしてはいけない理由を説明していますp
。
厳密に言えば、これは未定義の動作です。これは、p
が初期化されていないためです。ただし、セキュリティ上の理由から、多くの OS は、スタックまたはヒープに生の (初期化されていない) メモリ ブロックを提供しません。この単純な例では常に です (多くのサブルーチンを呼び出した場合は、異なる可能性がありp
ます)。NULL
*p ローカル変数は初期化されていないため、任意の値をランダムに取得できます (NULL を含む)
また、状況によっては、一部のコンパイラがこのオブジェクトを NULL に初期化することがありますが、これは標準では要求されていません。したがって、オブジェクトを初期化する方がよいでしょう。