3

重複の可能性:
C 構造体のサイズの不一致

次のプログラムでは、構造体のサイズを取得したいと思います。ただし、サイズは ではなく 12 になり4*4=16ます。各要素が異なるパッド番号に整列できるということですか? int4 や2 と同様shortですが、この場合、char は 1 でなければなりません。

どうも。

#include <stdio.h>

struct test{
int a;
char b;
short c;
int d;

};

struct test A={1,2,3,4};

int main()
{

    printf("0X%08X\n",&A.a);
    printf("0X%08X\n",&A.b);
    printf("0X%08X\n",&A.c);
    printf("0X%08X\n",&A.d);
    printf("%d\n",sizeof(A));

}

結果は次のとおりです。

0X00424A30
0X00424A34
0X00424A36
0X00424A38
12
4

4 に答える 4

1

はい、すべてのタイプが同じ配置になっているわけではありません。各変数は正しく配置されている必要があります。つまり、それらのアドレスは特定のサイズの倍数である必要があります。通常のルール(特にIntelとAMDの場合)は、すべてのデータ型が独自のサイズで整列されることです。x86アーキテクチャを想定すると、ここにあるようです。

  • 0X00424A30:構造の最初のアドレス。
  • 0X00424A34:最初のメンバーの4バイト(多分sizeof(int))後。charの配置が必要な1ため、ここでパディングする必要はありません。
  • 0X00424A36:2番目のメンバーの2バイト後。short2のアライメントが必要なため、1バイトのパディングがあります。
  • 0X00424A38:2番目のメンバーの2バイト後。int4のアラインメントが必要ですが、アドレスはすでに4の倍数です。したがって、パディングバイトはありません。

とにかく、それは移植性のある仮定ではありません。C標準はここでは何も強制しません。メンバー間および構造体の最後にバイトをパディングすることができます。

ちなみに、次の形式を使用する必要があります。

  • %pポインタの型キャスト。
  • %zuまたは%uの型キャストを使用しsizeofます。
于 2012-11-10T17:01:01.040 に答える
1

はい。パディングは実装次第であるため、さまざまなプラットフォームで異なる結果になる可能性があることに注意してください。C99 仕様のセクション 6.7.2.1 では、構造体のメンバー間とその末尾にパディングがある可能性があるとのみ述べています。移植可能なプログラムを作成するには、パディングの長さについて何の仮定もすべきではありません。

于 2012-11-10T17:05:40.093 に答える
1

はい、各タイプには独自の配置制限があります。

型のアラインメント制限Tは、 の倍数であるアドレスへのアラインメントを要求するよりも厳密になることはありません。これsizeof(T)は、配列の 2 つの要素が、正しくアラインメントT arr[2]するために追加のパディングなしですぐに相互に続く必要があるためです。arr[1]コンパイラがより厳密でないアライメント要件を使用することは許可されています。

例えば、

  • charオブジェクトはバイト境界で整列されている必要があります (定義sizeof(char) == 1による)
  • short通常、オブジェクトは 2 バイトでアラインされます ( を使用sizeof(short) == 2) が、一部のアーキテクチャではバイト アラインされることもあります。
  • オブジェクトはint通常 4 バイトでアラインされます (とsizeof(int) == 4) が、一部のアーキテクチャでは 2 バイトまたは 1 バイトでアラインされることもあります。
  • 型は通常、structそのメンバーの中で最も厳密に整列された型の整列要件に等しい整列を必要とします (最小整列 > 1 の場合もあります)。

構造体を構築するとき、最初のメンバーがオフセット 0 にある状態で、構造体の開始に対してメンバーをすべて正しく位置合わせする必要があります。合わせます。

于 2012-11-10T17:06:04.223 に答える
0

はい。なぜならPacking and byte alignment 一般的な答えはそれcompilers are free to add padding between members for alignment purposeです。

于 2012-11-10T17:03:35.197 に答える