サイトマップ / 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言語講座−それ自体コンパイルできる教材を使った講座です−

青い直線

サイトマップ / C言語講座出入り口総目次目次:構造体>構造体のパッディング