サイトマップ / C言語講座>出入り口>総目次>目次:構造体>構造体のパッディング
[複素数を構造体で表現]←このソース→[円周率の近似値]
構造体の各メンバに必要なメモリを合計すると、構造体のサイズになるのでしょうか。タグ名がtype1とtype2の2つの構造体を下記に示します。
struct type1{ char str1[4]; int n; }; struct type2{ char str2[5]; int n; };
二つの構造体の違いは、構造体の最初のメンバが4バイトか5バイトかの違いです。int型の整数は多くの処理系で2バイトですから、type1のサイズは6バイトで、type2のサイズは7バイトのはずです。
今回はsizeof( )演算子を使って、上記の構造体の各メンバのサイズと構造体のサイズを表示させます。sizeof( )演算子で返ってくる値の型はunsigned int型として今回のソースプログラムは作られていますが、コンパイラによっては、unsigned long型を返すものもあります。プログラムを実行して表示が異常だったら、printf( )の書式指定子を'lu'に変更して下さい。ソースプログラムは平易で分かりやすいと思います。実行結果とソースプログラムを見比べて下さい。 */
#include <stdio.h> struct type1{ char str1[4]; /* 4 バイト */ int n; /* 2 バイト */ }; /* 計 6 バイト */ struct type2{ char str2[5]; /* 5 バイト */ int n; /* 2 バイト */ }; /* 計 7 バイト */ void main(void); void main(void) { struct type1 type1; struct type2 type2; /* 構造体 type1 を表示 */ printf("struct type1{\n"); printf("\tchar str1[4];\n"); printf("\tint n;\n"); printf("};\n"); /* 構造体 type1 のメンバのサイズを表示 */ printf("sizeof(char) * 4 = %u\n", sizeof(char) * 4); printf("sizeof(int) = %u\n", sizeof(int)); /* 構造体 type1 のサイズを表示 */ printf("sizeof(type1) = %u\n\n", sizeof(type1)); /* 構造体 type2 を表示 */ printf("struct type2{\n"); printf("\tchar str2[5];\n"); printf("\tint n;\n"); printf("};\n"); /* 構造体 type2 のメンバのサイズを表示 */ printf("sizeof(char) * 5 = %u\n", sizeof(char) * 5); printf("sizeof(int) = %u\n", sizeof(int)); /* 構造体 type2 のサイズを表示 */ printf("sizeof(type2) = %u\n\n", sizeof(type2)); } |
/* 実行結果はいかがでしたでしょうか。二つの構造体のサイズが同じになった場合には、メモリのサイズが奇数のメンバの後ろにパッディングといって、詰め物が入ったためです。多くのコンピュータでは、メモリの割り付けが偶数アドレスに対して行われます。 */
[複素数を構造体で表現]←このソース→[円周率の近似値]
/* (C) 2000- YFプロ. All Rights Reserved. */ 提供:C言語講座−それ自体コンパイルできる教材を使った講座です−