0

たとえば、このコード:

struct test{
    int ID;
    bool start;
};

struct test * sTest;

void changePointer(struct test * t)
{
    t->ID = 3;
    t->start = false;    
}

int main(void)
{
    sTest->ID = 5;
    sTest->start = true;
    changePointer(sTest);
    return 0;
}

このコードを実行すると、出力はどうなりますか?(つまり、このようなポインターを渡すと、参照が変更されますか、それとも単なるコピーですか?)

前もって感謝します!

4

3 に答える 3

2

あなたのプログラムには出力がないので、何もありません。

sTestまた、ポインタが有効なメモリを指すように初期化されることもないため、結果はまったく定義されていません。このプログラムは未定義の動作を引き起こし、実行時にクラッシュする必要があります/クラッシュする可能性があります/可能性があります。

ポインターがタイプ の有効なオブジェクトを指すように初期化されていた場合struct test、その構造体のフィールドは、 の最後でが 3main()IDなるように変更されます。内部changePointer()で行われた変更は、で行われた変更と同じメモリで行われます。main().

簡単な修正は次のとおりです。

int main(void)
{
   struct test aTest;
   sTest = &aTest;    /* Notice the ampersand! */
   sTest->start = true;
   changePointer(sTest);

   return 0;
}

trueまた、C99 より前の C にはキーワードがないことに注意してください。

于 2012-05-09T09:17:57.903 に答える
0

1)構造を保存するためのメモリを割り当てていないため、最初にコードがクラッシュします..追加する必要があるかもしれません

 sText  = malloc(sizeof(struct test));

2) クラッシュを修正した後、構造体ポインターを渡すことができ、changePointer 関数で行った変更はメインとその逆に反映されます。

3)しかし、何も印刷していないので、プログラムへの出力はありません..

于 2012-05-09T09:18:22.200 に答える
0

唯一の問題は、なぜグローバル名前空間にテスト ポインターが必要なのかということです。2 つ目は、メモリ割り当て操作がないことです。また、関数の入力パラメーターとしてポインターがあります。そのため、「changePointer」で指す構造体を変更します。

于 2012-05-09T09:21:10.450 に答える