• ベストアンサー

共用体のサイズをsizeofで

共用体の全体のサイズを調べようと、 printf("%u",sizeof(test)); //testは共用体の型名です としたら、コンパイルエラーが出ました。エラーの内容は「'test':定義されていない識別子です」でした。共用体のサイズはsizeofですることができると聞いたのですがどうやるのでしょう?特に共用体全体のサイズを知りたいです。回答よろしくお願いします。

noname#113783
noname#113783

質問者が選んだベストアンサー

  • ベストアンサー
  • jacta
  • ベストアンサー率26% (845/3158)
回答No.1

testではなく、union testでは? それと、sizeof演算子の評価結果はsize_t型ですので、printfの書式は"%zu"にする必要があります。 古い規格では"%zu"はサポートされませんので、(unsigned int)sizeof(...)のように適当にキャストしてください。

noname#113783
質問者

お礼

詳しい説明ありがとうございます! 独学なので知らない情報があって助かります。 回答ありがとうございました。

関連するQ&A

  • 構造体サイズをコンパイル時に出力させられるか(gcc)?

    gccでソースの改造でメモリ節約のため構造体サイズの圧縮を行っているのですが、 構造体定義が#defineマクロの塊になってしまっているのでサイズの見当がつかなくて 困っています。 sizeofの値をコンパイル時のエラーメッセージ出力などを使って出力できれば、 実装してターゲットでprintf()を動かさなくてもいいので助かるのですが、プリ プロセス命令の組み合わせとかでどうにかならないでしょうか?

  • 共用体の配列 [C言語]

    今C言語のプログラムを組んでいたのですが、共用体の配列あるわけないと思いつつ共用体の配列を宣言したソースをコンパイルして見ました。そしたら普通にコンパイルできてしまったんです。びっくりしてその配列に値を代入したのですが、それはコンパイルエラーが出ました。共用体の配列なんてあるのでしょうか?回答よろしくお願いします。

  • (Mac) sizeof演算子のコンパイル

    現在MacBookAirにて入門書を参考にC言語を学んでいます。 その中で、 #include <stdio.h> int main(void) { int a = 1; printf("short int型のサイズは%dバイトです。\n", sizeof(short int)); printf("変数aのサイズは%dバイトです。\n", sizeof(a)); return 0; } と入力しコンパイルすると sample21.c:7: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘long unsigned int’ sample21.c:8: warning: format ‘%d’ expects type ‘int’, but argument 2 has type ‘long unsigned int’ と表示されコンパイルすることができません。 なんども見直してコードに間違いはないと思いますが、原因が解りません。 他のコードは問題なくコンパイルできます。 この先、sizeof演算子を使って値を求めなければならない章があり、非常に困っています。 どなたか解決策を教えてください。お願いします。

  • 引数が配列のときの関数内でのsizeofについて

    こんにちは. Cを勉強している最中に疑問にあったことを質問させていただきます.以下のプログラムで配列myarrayの中の最大のメンバーを見つけるプログラムです.コメントアウトしてある //int ary_size = sizeof(myarray)/4; をグローバル変数で定義するとうまく最大の数を見つけてくれるのですが, 関数の中で int ary_size = sizeof(ary)/4; と定義するとうまくいきません.そこで,以下の printf("The size of the ary is %d\n",ary_size); という表示を追加したところ,ary_size = 1となっていることが分かりました. なぜそうなるのでしょう?関数の引数はint ary[]の配列なので,sizeof(ary)でaryがメモリ中で占めるバイト数が得られるんじゃないんですかね?ちなみに私の環境ではsizeof(int)は4バイトなので int ary_size = sizeof(ary)/4; と割る4で配列のメンバーの数を求めています. 初心者の質問ですみませんがよろしくお願いします. #include <stdio.h> #include <Windows.h> int myarray[] = {1,2,3,4,5,6,7,2}; int FindMax(int ary[]); //int ary_size = sizeof(myarray)/4; int main() { int max; max = FindMax(myarray); printf("The maximum value is %d\n",max); Sleep(2000); return(0); } int FindMax(int ary[]) { int ary_size = sizeof(ary)/4; int i; int max; max = ary[0]; for(i=1;i<ary_size;i++) { if(ary[i]>max) { max = ary[i]; } } printf("The size of the ary is %d\n",ary_size); return(max); }

  • C言語、エラーメッセージが紐解けません。

    いつも大変お世話になり誠にありがとうございます。 標記の件。 エラーメッセージが紐解けません。 どうかどなたかアドバイスください。 下記にコードとコンパイルエラーを書きます。        記 コード #include <stdio.h> typedef struct Car{ int num; double gas; }Car; int main(void) { printf("int型のサイズは%dバイトです。\n", sizeof(int)); printf("double型のサイズは%dバイトです。\n", sizeof(double)); printf("構造体struct Car型のサイズは%dバイトです。\n",sizeof(Car)); printf("構造体struct Car型へのポインタのサイズは%dバイトです。\n",sizeof(Car *)); return 0; } コンパイラーエラー C:\MinGW>gcc text20.c -o text20 text20.c: In function 'main': text20.c:12:11: warning: unknown escape sequence: '\221' printf("構造体struct Car型のサイズは%dバイトです。\n",sizeof(Car)); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ text20.c:13:11: warning: unknown escape sequence: '\221' printf("構造体struct Car型へのポインタのサイズは%dバイトです。\n",sizeof(Car *)); 以上です。 ご多忙中恐れ入ります。 ご回答の程宜しくお願い申し上げます。

  • C言語のsizeof(サイズオブ)演算子について

    はじめまして。 C言語の初学者です。 sizeof(サイズオブ)演算子の理解でつまづいています。 参考書の説明は下記の通りです。 要素数を数えるのは面倒くさいので、要素数を自動的に求めて繰り返させることにします。 要素数を求める直接的な方法は用意されていませんが、計算することは出来ます。 配列全体のサイズを求め、それを要素1つのサイズで割れば要素の数がわかります。 C言語には、変数や配列のサイズを求めるsizeof(サイズオブ)演算子があります。 sizeof演算子は、次のようにして使います。 sizeof(変数や配列名) sizeof演算子には()をつけなくても良いのですが、つけた方が読みやすいでしょう。 この演算子を使って配列arrayの要素数を求めるには次のようにします。 sizeof(array) / sizeof(array[0]) 上記の説明文にある、【配列全体のサイズ】と【要素1つのサイズ】の【サイズ】とは何を指しているのでしょうか。 また、上記の【sizeof(array) / sizeof(array[0])】の割り算の意味が分かりません。 下記のプログラムを例にして、具体的に何を何で割っているのか数字を当てはめて教えてください。 よろしくお願い致します。 #include <stdio.h> int main(void) { int array[] = {42,79,13,75,19}; int i; for (i = 0;i < sizeof(array) / sizeof(array[0]);i++) { printf("array[%d] = %d\n",i,array[i]); } return 0; } このプログラムの実行結果は次の通りになります。 array[0] = 42 array[1] = 79 array[2] = 13 array[3] = 75 array[4] = 19

  • 左側がクラス、構造体、共用体、ジェネリック型への

    VS2008 でVC++のコンパイルをしたときに、 「error C2227: '->SetValueXyzwpr2' : 左側がクラス、構造体、共用体、ジェネリック型へのポインタではありません。」のエラーがでました。ネット上で、このエラーを探すと、GetValueXyzwprが定義していないとありますが、同じソース上の違う関数の中で使っているところではエラーがでません。今回新たに記述したところで発生しています。 【ソース】frrjiftestDlg.cpp void CFrrjiftestDlg::PrintFrameOfData(FILE *handle, sFrameOfData *FrameOfData)    pSysVarPos->SetValueXyzwpr2(X,Y,Z,W,P,R,E1,E2,E3,C1,C2,C3,C4,C5,C6,C7,UF,UT); ←ここでエラーがでます。 同じ、cpp 上で、 void CFrrjiftestDlg::OnButtonSetSysvar()  ←ここの中でも同じ使い方をしていますが、こちらではエラーはでません。 まったく、理由が分からず困り果てています。

  • c言語 共有体について

    c言語 共有体について  下記のプログラムのLinuxとWindowsのint型の大きさ4バイト、有効ビット数   32ビットともに同じであるが、bar.valの値が違う理由を教えてください。 〇プログラムの実行結果 linux:(Gcc) 共用体のサイズ 40563412 Windows(Bcc32) 共用体のサイズ  563412  〇プログラム: #include <stdio.h> union foo { int val; char b[4]; }; int main(void) { union foo bar; bar.b[0] = 0x12; bar.b[1] = 0x34; bar.b[2] = 0x56; bar.b[4] = 0x78; printf("共用体のサイズ %d\n", sizeof(bar)); printf("val = %x\n", bar.val); return 0; }

  • 共用体について

    こんにちは。 質問させてください。 下記のプログラムをコンパイル、実行したところ、警告が出て自分の思った通りに動作しません。 #include <iostream> class hoge { public:   union   {     float _1,_2;     float _a,_b;     float ar[2];   };   hoge( float i, float j ); }; hoge::hoge( float i, float j )   : _1( i )   , _2( j ) { } void main() {     hoge huga( 0,1 );     std::cout << sizeof( hoge ) << std::endl;     std::cout << huga._1 << " : " << huga._2 << std::endl; } 警告の内容は 「warning C4608: 'hoge::_2' は既に初期化子リスト 'hoge::<unnamed-tag>::hoge::_1' 内の他の共用体メンバにより初期化されています。」 となり、このまま実行をかけると 8 1 : 1 という実行結果になってしまいます。 自分が期待した実行結果は 8 0 : 1 なのですが、どのようにUnionを使えば期待した通りに動きますでしょうか。 /* WindowsXP 32bit Professional Memory 2GB CPU Core2Duo 2.44GHz VisualStudio2005 AcademicEdition コンパイラの警告レベル4 */ ちなみにunionの部分を   union   {     struct     {       float _1,_2;     }     struct     {       float _a,_b;     }     float ar[2];   }; のように修正すると期待した通りに動くのですが警告レベル4のおかげで 「warning C4201: 非標準の拡張機能が使用されています : 無名の構造体または共用体です。」 という警告が出てしまいます。 警告レベルを下げることとpragmaで警告を抑制することはしたくないのですがどのようにコードを修正すれば期待した通りに動作しますでしょうか。 よろしくおねがいします。

  • 共用体、混合型はサポートされないというエラーがです

    Microsoft VS2022でVC++を開発していたところ 下記①,②,③で"共用体名"をマネージ”プロジェクト名::MyForm” のメンバーとして定義できません。混合型はサポートされていませんというエラー(C4368)が発生します。対処法を教えてもらえないでしょうか(Microsoft VS2022) <MyForm.h> .. namespace プロジェクト名 {.. union AB { short int a_1; short int a_2; } .. .. class { union AB u_1;① union AB u_2;② union AB u_3;③ Myform_Load { } Myform_Paint { } }; }

専門家に質問してみよう