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

struct Student {
       char name[100];
       int id;
       char major[50];
       char address[200];
};

int main()
{

     struct Student st;

     strcpy(st.name, "Chuck");
     st.id = 20001;
     strcpy(st.major, "Computer Science");
     strcpy(st.address, "1st Street");

     printf("%d %d %d %d %d\n", sizeof(st), sizeof(st.name),sizeof(st.id), sizeof(st.major), sizeof(st.address));

     return 0;
}

出力は 356 100 4 50 200 です。なぜ sizeof(st) は 354 ではなく 356 なのですか? そして、intなしでこれを試してみたところ、出力は350 100 50 200だったので、問題は整数にあると思います。

4

2 に答える 2

7

これは、structメンバー間のパディングによるものです。パディングは、各データ メンバーがメモリ内で正しく配置されるようにするために必要です。正確な配置要件は、アーキテクチャによって異なります。

このため、 astructのサイズがそのメンバーのサイズの合計に等しいと仮定することはできません。

于 2013-03-29T06:36:52.783 に答える
1

構造体の先頭以外の各フィールドの前にギャップ (またはパディング) を付けることができます。コンパイラは、プロセッサと ABI 規則のニーズに合わせてギャップを追加しています。

structコンパイラを信頼する必要があります。コンパイラは、実装の必要に応じてレイアウトされています。

一部のコンパイラは、構造体のレイアウトを変更または改善するための拡張機能を提供します。たとえば、またはの GCCの型属性です。alignedpacked

内部のパディングやギャップをstruct問題としてではなく、利点として感じないでください。コンパイラは、プロセッサ、ABI 規則などを満たすために非常に懸命に努力します。

ほとんどのコンパイラは、構造体のフィールドを並べ替えません (GCC には、これを行うほとんど役に立たない最適化がありましたが、その最適化は削除されました。たとえば、LTO の場合など)。

サイズを気structにし、フィールドの順序を気にしない場合は、巧妙に並べ替えることができます。ただし、最も密な順序はアーキテクチャに依存する可能性があります。

intところで、C 標準では、 anが 32 ビットであること、またはより大きなサイズとアラインメントであることさえ保証されていませんchar(それが非常に一般的であっても)。それは<stdint.h>int32_tその目的のために提供します。int-s が 16 ビットである 16 ビット マシン (たとえば、1980 年代の Intel 8086 プロセッサを搭載したオリジナルの PC AT、または安価な 16 ビット マイクロコントローラ)用にコンパイルする場合、パディングやギャップは見られないと思います。

于 2013-03-29T06:37:33.737 に答える