0

次のテスト プログラムを考えてみましょう ( codepad の実行)。

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


struct camp {
    char b[8];
};


int main()
{
    struct camp c;
    strcpy(c.b, "Hello");
    c.b[5] = '\0';
    printf("c size: %d\nAddress (amp): %d :: %d\n", sizeof(c), &c, c);
    printf("Address of b: %d :: %d\n", &(c.b), c.b);

    return 0;
}

出力例:

c size: 8
Address (amp): -1082463628 :: 1819043144
Address of b: -1082463628 :: -1082463628

&(c.b)と(printf の 2 回目の呼び出し) で指定されたアドレスc.bは同じですが、同じ for struct camp c(printf の最初の呼び出し) は異なるアドレスを返します。さらに、または&cと同じです。&(c.b)c.b

正確には何が起こっているのですか?

4

2 に答える 2

5

printf最初のケースでやろうとしているのは、整数として解釈することですccは整数ではなく、(明示的または暗黙的に) 整数に変換できる値でさえないため、未定義の動作を呼び出しているため、書き込まれる値は何でもかまいません。

于 2012-12-10T07:15:05.103 に答える
1

構造体にはデータ メンバーが 1 つしかないbためc、構造体オブジェクトと同じアドレスが表示されます。

また、配列名はその配列の最初の要素のアドレスを提供します。したがって、後者は配列全体のアドレスであるc.bため、同じアドレスを提供します。&(c.b)

&c &(c.b)c.bあなたの場合は同じになりますが、あなたはformat specifiercを使用して出力しているので、最後の引数はのアドレスではありません(したがって、ガベージ値を取得しています)。%dundefined behaviourc

于 2012-12-10T07:15:46.150 に答える