構造体のサイズ取得方法に関しまして(c言語初心者です。)

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kirincyan

構造体のサイズ取得方法に関しまして(c言語初心者です。)

#1

投稿記事 by kirincyan » 12年前

お世話になります。
c言語初心者です。

構造体のサイズをsizeof関数を使用して
取得する方法について質問があります。

コード:

#include <stdio.h>

typedef struct sAst{
    char A1;
    char A2;
}sAst;

typedef struct sBst{
    char a;
    int b;
    sAst* pAst;
}sBst;


int main()
{
    sAst* pTest;

//    sAst TestAst;

    sAst Ast1[] = {{1, 25},
                   {2, 26},
                   {3, 27}};

    sAst Ast2[] = {{11, 12},
                   {13, 14},
                   {15, 16},
                   {17, 18},
                   {19, 20}};

    sAst Ast3[] = {{1, 25},
                   {3, 27}};

    sBst Bst1[] = {{'M', 19, Ast1},
                   {'F', 25, Ast2},
                   {'S', 27, Ast3}};

    printf("Ast1=%d\n", sizeof(Ast1));
    printf("Ast2=%d\n", sizeof(Ast2));
    printf("Ast3=%d\n", sizeof(Ast3));

    return 0;
}
上記のようなコードで、
Ast1、Ast2、Ast3の構造体のデータサイズを取得するために
sizeof(Ast1)
sizeof(Ast2)
sizeof(Ast3)
のような方法で、サイズを取得ことは可能であると思うのですが、

構造体Bst1を使用して、
Ast1、Ast2、Ast3の構造体のデータサイズを取得することは不可能でしょうか。
もしもご存知あればご教授願えないでしょうか。

P.S.
例えば、sAst構造体が多数あって、
そのsAstのポインタがBst1に登録されているような場合に、構造体Bst1を使用して、
各sAstのデータを登録された段数だけ取得するような処理を実現するような場合に
各sAstのデータを登録された段数を知るが必要であると思っています。
( 例えば、Ast1(段数3)、Ast2(段数5)、Ast3(段数2)。 )

不可能な場合は、
各sAst構造体の最終段に、
構造体のターミネートを指し示すような情報を追加するの対策方法等を行うことが必要なように思っています。

アバター
bitter_fox
記事: 607
登録日時: 13年前
住所: 大阪府

Re: 構造体のサイズ取得方法に関しまして(c言語初心者です。)

#2

投稿記事 by bitter_fox » 12年前

kirincyan さんが書きました: 構造体のサイズをsizeof関数を使用して
取得する方法について質問があります。
sizeofは関数ではなく演算子です。
http://ja.wikipedia.org/wiki/Sizeof
kirincyan さんが書きました: 構造体Bst1を使用して、
Ast1、Ast2、Ast3の構造体のデータサイズを取得することは不可能でしょうか。
もしもご存知あればご教授願えないでしょうか。
sBst.pAstはポインタなんでsizeof(Bst1[0].pAst)としても得られるのはポインタの大きさになってしまうので厳しいですね。

ISLe
記事: 2650
登録日時: 13年前
連絡を取る:

Re: 構造体のサイズ取得方法に関しまして(c言語初心者です。)

#3

投稿記事 by ISLe » 12年前

kirincyan さんが書きました: 各sAst構造体の最終段に、
構造体のターミネートを指し示すような情報を追加するの対策方法等を行うことが必要なように思っています。
それもよく使われる手法ですが、sBst構造体に要素数を持つメンバを追加するというのはどうでしょう。

Ast1の要素数は
sizeof Ast1/sizeof Ast1[0]
で求めることができます。

#define ARRAYSIZE(a) (sizeof a/sizeof a[0])
というマクロを定義して
ARRAYSIZE(Ast1)
と記述すると分かりやすいし楽チンです。

kirincyan

Re: 構造体のサイズ取得方法に関しまして(c言語初心者です。)

#4

投稿記事 by kirincyan » 12年前

bitter_foxさん、ISleさん

回答ありがとうございます。

このような場合は、
ご教授頂いたような、
"sBst構造体に要素数を持つメンバを追加する"
等の方法で対応するようにします。

ありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る