2

重複の可能性:
静的変数はどこに保存されていますか (C/C++)?

初期化されたすべてのグローバル変数は初期化されたデータ セグメントに割り当てられ、初期化されていないすべての静的およびグローバル変数は 0 に初期化され、BSS に割り当てられることを読みました。以下の定義の場合、

static int i = 0;

スペースはどこにi割り当てられますか? が初期化されているため、初期化されたデータ セグメント上にあるのでしょうか、それとも の値が 0iであるため BSS にあるのでしょうか?i

4

3 に答える 3

9

はい、初期化されていない静的変数はデフォルトで 0 に初期化されます。これは C では常に当てはまります。

データの保存場所は実装に依存します....BSS(シンボルによって開始されるブロック)に入るのは、初期化された0の静的変数(iあなたの場合)であることがわかりました。

たとえば、0 以外の初期化された静的は .DATA に入りstatic int i=2;ます。

ポイントを示すには:

int main(int argc, char * argv[])
{
    return 0;
}

「test.c」に保存

> gcc test.c
> size a.out
text     data     bss   dec    hex   filename
1056     252      8     1316   524   a.out

次に、次のように更新します。

int main(int argc, char * argv[])
{
    static int i;
    return 0;
}

> gcc test.c
> size a.out
text     data     bss   dec    hex   filename
1056     252      12    1316   524   a.out

次のように再度変更します。

int main(int argc, char * argv[])
{
    static int i = 2;
    return 0;
}

> gcc test.c
> size a.out
text     data     bss   dec    hex   filename
1056     256      8     1316   524   a.out
于 2012-12-11T12:34:47.530 に答える
0

このプログラムをコンパイルするとき、gcc 4.5.2 を使用する Linux では実装に依存します。

static int a[1000000] = {1}; void main() {}

サイズ3.9Mの実行可能ファイルを取得します-配列の最初の要素が(ゼロ以外の値で)初期化されるため、配列「a」は.dataセグメントに移動します。

配列をゼロで初期化すると:

static int a[1000000] = {0}; void main() {}

サイズが 8.2K の実行可能ファイルを取得しました。このようなサイズの違いは、今回は 'a' 配列が .bss セグメントにあったことを示していると思います。

于 2012-12-11T12:54:17.123 に答える
0

これは実際のコンパイラ/実装に本当に依存しますがi、ファイルレベル (つまり、関数の外側) またはstatic関数内にあり、値が0.

于 2012-12-11T12:30:16.367 に答える