0

構造体ポインタが常にnilデフォルトで初期化されるというこの問題が発生しています。以下は私のコードです。

#include <stdio.h>

struct SomeStruct {
    int x;
};

int main()
{
    int array[2];  // If I change this to 1, the code works fine

    struct SomeStruct *ptr;
    printf("%p\n", ptr);  // always prints "nil"
}

誰かがここで何が起こっているのか説明してもらえますか?具体的には、配列のサイズを1に変更すると、コードが正常に実行されるのはなぜですか。

上記はいくつかのより大きなコードの一部であり、私はこれに問題を単純化することができました。後で使用する必要がありますptrが、そのままセグメンテーション違反が発生しnilます。

4

2 に答える 2

2

誰かがここで何が起こっているのか説明してもらえますか?具体的には、配列のサイズを1に変更すると、コードが正常に実行されるのはなぜですか。

ptr初期化せずに使用しています。配列のサイズを変更すると、スタックのレイアウトが変更され、運が良ければコードが「正常に」実行されます。

後でptrを使用する必要がありますが、nilであるため、セグメンテーション違反が発生します

次に、それにメモリを割り当てます。

ptr = malloc(sizeof *ptr);
于 2013-02-10T11:39:15.707 に答える
1

初期化されていない変数にアクセスしているため、未定義の動作に依存しています。結果は何でもかまいません。

実際には、プログラムの実行時にスタックに発生したゴミのアーティファクトが表示されます。

于 2013-02-10T11:39:06.553 に答える