#include<stdio.h>
char* call();
void hello();
void hello2();
int main()
{
char * p=call();
hello();
hello2();
printf("%c\n",*p);
return 0;
}
void hello()
{
printf("HELLO\n");
}
void hello2()
{
printf("hello2\n");
}
char* call()
{
char a = 's';
char *b = &a;
return b;
}
上記のプログラムは次の出力を提供します。
こんにちは
hello2
s
私が知っているのは、メインからcall()関数を呼び出すと、スタックフレームがスタックに割り当てられ、call()関数がアドレスを返すと、メモリが割り当て解除されますが、変数に格納されている値を出力しようとすると、 'a'の場合、出力は正しいです。私が持っている混乱は、割り当てを解除した後でも、なぜ出力が正しいのかということです。
出力が正しいと見なすべきではありません。見た目は正しいですが、偶然だと考えてください。あなたは未定義の動作を観察しています。これは理論的には、期待する値を生成したり、ハードドライブをフォーマットしたり、(一部の人が言うように)悪魔を鼻から飛ばしたりするなど、何かが起こる可能性があることを意味します。ポインタはゴミを指しています。何か有効なことを示しているように見えるかもしれませんが、観察した動作が将来再現可能であるという保証はありません。
出力が「正しい」ように見える理由については、通常、割り当て解除時にメモリが自動的にクリアされません。これを行うことは余分な作業であり、通常、デフォルトで行われることではありません。もう1つの可能性は、「ワイルド」ポインタにアクセスしているため、最初に割り当てた値と偶然に一致するランダムな値が返されることです。(彼らが言うように、壊れた時計は1日2回正しいです。)
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加