スタックからメモリを割り当て解除した後でも、出力がガベージではないのはなぜですか?

シュバムタンダン
#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'の場合、出力は正しいです。私が持っている混乱は、割り当てを解除した後でも、なぜ出力が正しいのかということです。

jamesdlin

出力が正しいと見なすべきではありません。見た目は正しいですが、偶然だと考えてください。あなたは未定義の動作を観察してます。これは理論的には、期待する値を生成したり、ハードドライブをフォーマットしたり、(一部の人が言うように)悪魔を鼻から飛ばしたりするなど、何かが起こる可能性があることを意味します。ポインタゴミを指してます。何か有効なことを示しているように見えるかもしれませんが、観察した動作が将来再現可能であるという保証はありません。


出力が「正しい」ように見える理由については、通常、割り当て解除時にメモリが自動的にクリアされません。これを行うことは余分な作業であり、通常、デフォルトで行われることではありません。もう1つの可能性は、「ワイルド」ポインタにアクセスしているため、最初に割り当てた値と偶然に一致するランダムな値が返されることです。(彼らが言うように、壊れた時計は1日2回正しいです。)

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

分類Dev

ヒープメモリの割り当てがスタックメモリの割り当てよりもはるかに速いのはなぜですか?

分類Dev

ネットコア2.0のガベージコレクターがすべてのメモリを解放しないのはなぜですか

分類Dev

C ++スタイルとガベージコレクターでのメモリの割り当て解除の違いは何ですか?

分類Dev

mmapがメモリを割り当てられないのはなぜですか?

分類Dev

modprobeを設定してブラックリストを解除したにもかかわらず、sisfbモジュールがロードされないのはなぜですか?

分類Dev

Rガベージコレクターは、Rラッパーを使用するときにCで割り当てられたメモリを解放しますか?

分類Dev

2回クリックした後、イベントリスナーがボタンからバインド解除されるのはなぜですか?

分類Dev

モジュールをインストールした後でも、「モジュールのロード可能なオブジェクトが見つかりません」というメッセージが表示されるのはなぜですか?

分類Dev

DEBUGに設定した場合でも、Pythonロガーがより高いログレベルからメッセージを出力するのはなぜですか?

分類Dev

コピーアンドスワップのイディオムを使用して、コピーされたオブジェクトのデストラクタがメモリをポイントして割り当てを解除しないのはどうしてですか?

分類Dev

スキャンが機能しなくなったのはなぜですか(メモリ割り当てを使用)?

分類Dev

スキャンが機能しなくなったのはなぜですか(メモリ割り当てを使用)?

分類Dev

リザーブを使用してストレージを割り当てた後、ベクターの内容を繰り返して印刷できないのはなぜですか?

分類Dev

C#リンクリストクラス変数が割り当てられた後、その値を保持しないのはなぜですか?

分類Dev

NULLが割り当てられたポインタを単に逆参照してもクラッシュしないのはなぜですか

分類Dev

iOSを搭載した機器:メモリモニターが割り当てに同意しないのはなぜですか?

分類Dev

1.5以降でのGolangガベージコレクターの改善は、割り当て解除されるメモリの量に影響しますか?

分類Dev

ダイナミックメモリの割り当て解除におけるフルガベージコレクションとはどういう意味ですか?

分類Dev

ボタンをクリックしてもページが存在しないのはなぜですか?

分類Dev

初期化されていない変数がガベージ値を出力しないのはなぜですか?

分類Dev

なぜオブジェクトはdeallocメソッドで割り当て解除されないのですか?

分類Dev

`alloca`がメモリを割り当てることができるかどうかをチェックしないのはなぜですか?

分類Dev

メソッドから返されたラムダを使用している場合、イベントのサブスクライブ解除が機能する(「リークしない」)のはなぜですか?

分類Dev

ブレース初期化割り当てが変数をガベージで埋めるのはなぜですか?

分類Dev

ガベージコレクションを強制すると、Javaプロセスに割り当てられるメモリが増えるのはなぜですか?

分類Dev

動的に割り当てられたメモリブロックに非常に大きな単一の値を格納できないのはなぜですか?

分類Dev

ポインタを移動した後も、ポインタのメンバーへの割り当てが有効なのはなぜですか?

分類Dev

memcachedが結果を保存した後でも、データベースがヒットしているのはなぜですか?

分類Dev

Visual C ++でスタックメモリを動的に割り当てることができないのはなぜですか?しかし、gccはそれを行うことができます

Related 関連記事

  1. 1

    ヒープメモリの割り当てがスタックメモリの割り当てよりもはるかに速いのはなぜですか?

  2. 2

    ネットコア2.0のガベージコレクターがすべてのメモリを解放しないのはなぜですか

  3. 3

    C ++スタイルとガベージコレクターでのメモリの割り当て解除の違いは何ですか?

  4. 4

    mmapがメモリを割り当てられないのはなぜですか?

  5. 5

    modprobeを設定してブラックリストを解除したにもかかわらず、sisfbモジュールがロードされないのはなぜですか?

  6. 6

    Rガベージコレクターは、Rラッパーを使用するときにCで割り当てられたメモリを解放しますか?

  7. 7

    2回クリックした後、イベントリスナーがボタンからバインド解除されるのはなぜですか?

  8. 8

    モジュールをインストールした後でも、「モジュールのロード可能なオブジェクトが見つかりません」というメッセージが表示されるのはなぜですか?

  9. 9

    DEBUGに設定した場合でも、Pythonロガーがより高いログレベルからメッセージを出力するのはなぜですか?

  10. 10

    コピーアンドスワップのイディオムを使用して、コピーされたオブジェクトのデストラクタがメモリをポイントして割り当てを解除しないのはどうしてですか?

  11. 11

    スキャンが機能しなくなったのはなぜですか(メモリ割り当てを使用)?

  12. 12

    スキャンが機能しなくなったのはなぜですか(メモリ割り当てを使用)?

  13. 13

    リザーブを使用してストレージを割り当てた後、ベクターの内容を繰り返して印刷できないのはなぜですか?

  14. 14

    C#リンクリストクラス変数が割り当てられた後、その値を保持しないのはなぜですか?

  15. 15

    NULLが割り当てられたポインタを単に逆参照してもクラッシュしないのはなぜですか

  16. 16

    iOSを搭載した機器:メモリモニターが割り当てに同意しないのはなぜですか?

  17. 17

    1.5以降でのGolangガベージコレクターの改善は、割り当て解除されるメモリの量に影響しますか?

  18. 18

    ダイナミックメモリの割り当て解除におけるフルガベージコレクションとはどういう意味ですか?

  19. 19

    ボタンをクリックしてもページが存在しないのはなぜですか?

  20. 20

    初期化されていない変数がガベージ値を出力しないのはなぜですか?

  21. 21

    なぜオブジェクトはdeallocメソッドで割り当て解除されないのですか?

  22. 22

    `alloca`がメモリを割り当てることができるかどうかをチェックしないのはなぜですか?

  23. 23

    メソッドから返されたラムダを使用している場合、イベントのサブスクライブ解除が機能する(「リークしない」)のはなぜですか?

  24. 24

    ブレース初期化割り当てが変数をガベージで埋めるのはなぜですか?

  25. 25

    ガベージコレクションを強制すると、Javaプロセスに割り当てられるメモリが増えるのはなぜですか?

  26. 26

    動的に割り当てられたメモリブロックに非常に大きな単一の値を格納できないのはなぜですか?

  27. 27

    ポインタを移動した後も、ポインタのメンバーへの割り当てが有効なのはなぜですか?

  28. 28

    memcachedが結果を保存した後でも、データベースがヒットしているのはなぜですか?

  29. 29

    Visual C ++でスタックメモリを動的に割り当てることができないのはなぜですか?しかし、gccはそれを行うことができます

ホットタグ

アーカイブ