0

スタック上のものはデフォルトでは初期化されないことが一般的に知られています。スタック上の構造体でそれを証明しようとしましたが、予期せず、ポインターがnullで初期化されましたが、なぜですか?このポインタを初期化するのは何ですか?

#include <stdio.h>
#include <string.h>

struct strustri {
    int var1;
    char *var2;
};

int main()
{
    struct strustri test1 = {
            .var1 = 12,
            .var2 = "Teststring",
    };
    struct strustri test2;

    printf("test1.var1 is %d\n", test1.var1);
    printf("test2.var1 is %d\n", test2.var1);

    printf("test1.var2 points to %p\n", test1.var2);
    printf("test2.var2 points to %p\n", test2.var2);
    return 1;
}

そしてこれは私のマシン(Ubuntu 12.10)の出力です:

test1.var1 is 12
test2.var1 is -1271814320
test1.var2 points to 0x400634
test2.var2 points to (nil)

私は自分の例を複数回実行しました。毎回var1の別の値を取得しますが、var2は常にゼロ(nullポインター)を指します...

4

3 に答える 3

7

何も初期化されていません。

これは、スタックにたまたまゴミがあった場合のアーティファクトにすぎません。変数宣言の順序を切り替えるか、ローカル変数を追加すると、異なる結果が得られます。

于 2013-02-05T10:05:25.230 に答える
0

テスト構造を別の関数に入れてから、charの配列を作成する別の関数(たとえば200バイトの長さ)をいくつかの文字で埋めて、2つの関数を交互に呼び出すと、test2の値に気付くでしょう。異なる[ほとんどの場合、100%保証されているわけではありません。「未定義の動作」を扱っているため、何か別のことが起こる可能性があります]。

于 2013-02-05T10:09:46.327 に答える
0

int var1を実行してtest2のスペースを作成すると、それ自体にスペースが作成されますが、値を割り当てない場合は、すでに存在していた値が表示されます。

ただし、var2の場合はポインタです。ポインタが初期化されていない場合、ポインタは何も指さないため、nil、NULL、または'\0'になります。

于 2013-02-05T10:36:55.150 に答える