0

重複の可能性:
構造体の sizeof が各メンバーの sizeof の合計と等しくないのはなぜですか?
sizeof(struct) が予期しない値を返す

次の構造体 abc のサイズを見つけるプログラムを作成しました。

を。組み込みの sizeof() 演算子は、実際には 32 であるのに、この構造体のサイズが 40 であると言及していますか? また、これを判断するためにアドレスを減算してみましたが、結果も 40 になりました。

b. 「char g[3];」をコメントアウトすると 構造体 abc の内部では、abc のサイズ = 32 です。これも意味がありません。28歳じゃないの?

c. 「unsigned int」へのキャストが必要なのはなぜですか? キャストを行わないと、次のコンパイル エラー メッセージが表示されます。&a[0] は実際にはアドレス (int である必要があります) ではありませんか?

size_of_struct\size_of_struct.cpp(24): エラー C2440: '=': 'abc *' から 'unsigned int' に変換できません

情報: Win 7、64 ビット システムを実行しています。MS ビジュアル スタジオ コンパイラ。

#include <iostream>

struct char_three{
    char a[3];
};

struct int_three{
    int a[3];
};

struct abc 
{
    int a; // 4 bytes
    double b; // 8
    void *ptr; // 4
    char g[3]; // 4 due to padding ?
    int c[3]; // 12
}; // Total size of struct - 31 / 32.

int main () 
{
    abc a[2]; 
    unsigned int add0, add1;
    add0 = (unsigned int) &a[0];
    add1 = (unsigned int) &a[1];
    printf("add1 of a is :%x add0 is :%x\n", add1, add0);

    printf("size of struct abc : %d\n", add1-add0);
    printf("size of int: %d\n", sizeof(int));
    printf("size of double: %d\n", sizeof(double));
    printf("size of void ptr: %d\n", sizeof(void *));
    printf("size of 3 char: %d\n", sizeof(char_three));
    printf("size of 3 int: %d\n", sizeof(int_three));
    printf("size of a: %d\n", sizeof(a));
    system("pause");
    return 0;
}

O/P:
add1 of a is :51f828 add0 is :51f800
size of struct abc : 40
size of int: 4
size of double: 8
size of void ptr: 4
size of 3 char: 3
size of 3 int: 12
size of a: 80
Press any key to continue . . .
4

1 に答える 1

0

構造体のsizeof()に明示的に依存してはなりません。これは、コンパイラがパディングを導入するかどうか、および導入する場合はどこに導入するかを実装で定義します。GCC互換コンパイラを使用していて、他のツールチェーンを気にしない場合(待ってください、他のツールチェーンがありますか?)、__attribute__((packed))構造体にパディングをまったく追加しないようにコンパイラに指示するために使用できます。

于 2012-09-18T05:57:00.977 に答える