0

こんにちは、変数がメモリに残るか、すぐに破棄されるかを教えてください。

#include <stdio.h> 

int main()
{
    {
        int a=1;
        lab:
        printf("Value of a : %d",a);  
    }   

    return 0;
}

int まだメモリに残っているでしょうか?

4

3 に答える 3

3

いいえ、aローカルスコープ(括弧内で宣言)があるため、閉じ括弧でクリーンアップされます。

プログラム全体で永続化したい場合はstatic、できれば使用する前に、として宣言するか、中括弧の外側に配置します。

これには、コンパイラに初期化させるという追加の利点があります。

次のことを試すことができます。

#include <stdio.h>
int a;

int main()
{
    static int b;

    int c;

    printf("%d, %d, %d\n", a, b, c); /* a and b should print 0, printing c is undefined behaviour, anything could be there */

    return 0;
}

Bathsheba が指摘したように、static変数はマルチスレッド環境で使用する場合は慎重に使用する必要があります。

于 2013-07-11T13:21:11.350 に答える
3

の行に続く } に到達すると、 a は破棄されます(スタックからポップされます)printfので、いいえ、コメント行のメモリに残りません。

于 2013-07-11T13:20:49.037 に答える
1

まず第一に、実装固有ではありません。C 標準では、ブロックを離れると auto (ローカルで宣言された) ライフタイムを持つオブジェクトが破棄されると明示的に述べられています。

可変長配列型を持たないこのようなオブジェクトの場合、その有効期間は、関連付けられているブロックへのエントリから、そのブロックの実行が何らかの方法で終了するまで延長されます。 [ISO/IEC9899:TC3、6.2.4、5]

もちろん、この場合もスコープが失われるため、これをテストするのは困難です。(逆の場合は簡単にテストできます。) しかし、これは形式的な理由から重要です。オブジェクトよりも長く存続するオブジェクトへのポインターがある場合、プログラムは常に正しくなく、動作は未定義です – たとえ実装であっても。オブジェクトを生きたままにします。(定義されていない動作には、すべて正常に動作することも含まれます。)

于 2013-07-11T13:34:29.923 に答える