2

私が書いたプログラムは次のとおりです。

char* str_1;
void main()
{
    char* str_2;
    printf("STR_1 Address of pointer : %p\n", &str_1);
    printf("STR_2 Address of pointer : %p\n", &str_2);
    printf("STR_1 pointer : %p\n", str_1);
    printf("STR_2 pointer : %p\n", str_2);
}

出力は次のとおりです。

STR_1 Address of pointer : 00404048
STR_2 Address of pointer : 0028FF1C
STR_1 pointer : 00000000
STR_2 pointer : 7EFDE000

これをどのように説明できますか?

4

3 に答える 3

9

名前空間スコープで定義された変数は、デフォルトで値が初期化されるためstr_1、NULL を指します。

str_2初期化されていないため、行

printf("STR_2 pointer : %p\n", str_2);

実際には未定義の動作です。ガベージ値が出力されます。

于 2013-11-05T14:17:30.537 に答える
6
STR_1 Address of pointer : 00404048

これは、グローバル変数が配置された静的メモリ内のアドレスです。

STR_2 Address of pointer : 0028FF1C

これは、自動変数が配置されたスタック上のアドレスです。

STR_1 pointer : 00000000

静的ストレージ期間 (グローバルを含む) を持つ変数は、特に指定しない限りゼロで初期化されます。

STR_2 pointer : 7EFDE000

特に指定しない限り、自動変数は初期化されません。それらには、作成される前にたまたまメモリ内にあったガベージが含まれています。

(厳密に言えば、初期化されていない変数の値を使って何かを行うことは未定義の動作であり、それを出力することさえあります。)

于 2013-11-05T14:21:55.313 に答える