C言語の共有体について

このQ&Aのポイント
  • C言語の共有体(union)を使用すると、異なるデータ型を同じメモリ領域に格納できます。
  • 共有体は、メンバーのうち1つだけが同時に有効であるという特徴があります。
  • プログラムの実行結果から、LinuxとWindowsで共有体のサイズが異なることがわかります。
回答を見る
  • ベストアンサー

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; }

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

  • ベストアンサー
回答No.2

> bar.b[4] = 0x78; bar.b[3] = 0x78; では? あと,共用体なので,CPUのエンディアンが異なれば,値も異なります。

dreamsturb
質問者

お礼

回答ありがとうございます。barbの[3]でした、私の記入ミスでした。

その他の回答 (1)

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.1

〇プログラムの実行結果 linux:(Gcc) 共用体のサイズ 40563412 Windows(Bcc32) 共用体のサイズ  563412 となってますが、 40563412のどこまでが、共用体のサイズ で、どこからが、val=の値なのですか? 563412についても同様です。

dreamsturb
質問者

お礼

回答ありがとうございます。私の記入ミスでbarbの[4]は、共用体のサイズ外 でした。

関連するQ&A

  • C言語 構造体に関するプログラムのエラーについて

    次は自分で書いたプログラムの一部なのですが、このプログラムをコンパイルすると以下のようなエラーが表示されます。 struct monster{ int type; /* タイプ */ char trick[25]; /* 技 */ char trick2[25]; /* 技2 */ int tricktype; /* 技1のタイプ */ int tricktype2; /* 技2のタイプ */ int trickeffect; /* 技1の威力 */ int trickeffect2; /* 技2の威力 */ char name[10]; /* 名前 */ int power; /* 攻撃力 */ int diffence; /* 防御力 */ int speed; /* 素早さ */ int HP; /* 体力 */ /* 1,fire 2,water 3,nature 4,thunder 5,wind */ }; struct monster monster2[5] = { { 1, "a", "b", 1, 2, 120, 80, "v", 60, 60, 60, 100}, { 2, "a", "b", 2, 3, 120, 80, "w", 60, 60, 60, 100}, { 3, "a", "b", 3, 4, 120, 80, "x", 60, 60, 60, 100}, { 4, "a", "b", 4, 5, 120, 80, "y", 60, 60, 60, 100}, { 5, "a", "b", 5, 1, 120, 80, "z", 60, 60, 60, 100}, } void battle(int a[2][3], struct monster monster[], struct monster monster2[]) { ・ ・ ・ printf("player2は%sをくりだした。\n", monster2.name[a[1][0] - 1]); ・ ・ printf("%sの残り体力は%d。\n", monster2.name[a[1][0] - 1], monster2.HP[a[1][0] - 1]); } monsterbattle.c:467:61: エラー: 構造体または共用体ではない何かのメンバ ‘name’ の 要求です printf("player2は%sをくりだした。\n", monster2.name[a[1][0] - 1]); ^ monsterbattle.c:475:52: エラー: 構造体または共用体ではない何かのメンバ ‘name’ の 要求です printf("%sの残り体力は%d。\n", monster2.name[a[1][0] - 1], monster2.HP[a[1 ][0] - 1]); ^ monsterbattle.c:475:80: エラー: 構造体または共用体ではない何かのメンバ ‘HP’ の要 求です printf("%sの残り体力は%d。\n", monster2.name[a[1][0] - 1], monster2.HP[a[1 ][0] - 1]); このようなエラーがあちこちで表示されるのですが、どのようにプログラミングを改善すべきなのでしょうか? お手数ですが、よろしくお願いします。

  • C言語について プログラムが動きません

    ゲームのプログラムを作りたいものです。 今、試作の途中の段階で以下のようなプログラムを作ってみたのですが、 コアダンプが表示されてうまく起動しません。 どの点を変更すればいいのか、教えてください。 使っている言語はC言語です。 よろしくお願いいたします。 #include <stdio.h> #include <string.h> struct monster{ int type; /* タイプ */ char trick[25]; /* 技 */ char trick2[25]; /* 技2 */ int tricktype; /* 技1のタイプ */ int tricktype2; /* 技2のタイプ */ int trickeffect; /* 技1の威力 */ int trickeffect2; /* 技2の威力 */ char name[10]; /* 名前 */ int attack; /* 攻撃力 */ int diffence; /* 防御力 */ int speed; /* 素早さ */ /* 1,fire 2,water 3,nature 4,thunder 5,wind */ }; char names[5][10] = {"v", "w", "x", "y", "z"}; main(){ int s = 0; int a[3]; int i; int m; struct monster monster[5] = { { 1, "a", "b", 1, 2, 120, 80, "v", 60, 60, 60}, { 2, "a", "b", 2, 3, 120, 80, "w", 60, 60, 60}, { 3, "a", "b", 3, 4, 120, 80, "x", 60, 60, 60}, { 4, "a", "b", 4, 5, 120, 80, "y", 60, 60, 60}, { 5, "a", "b", 5, 1, 120, 80, "z", 60, 60, 60}, }; printf("好きなモンスターを3つ選んでください\n\n"); while (s < 1){ for (i = 0; i++; i<3){ printf("%d体目を選んでください。\n\n", i+1); for(m = 0; m++; m < 4) printf("%d, %s\n", m+1, monster[m].name); printf("5, %s\n\n", monster[4].name); scanf("%d", a[i]); printf("%d体目 : %s\n\n", i+1, monster[a[i]-1].name); } printf("これでよろしいですか?\n"); for(i = 0; i++; i<2) printf("%d体目 : %s ", i+1, monster[a[i]-1].name); printf("3体目 : %s\n\n", monster[a[2]-1].name); printf("1、はい 2、いいえ\n"); scanf("%d", &i); if(i=1) return s = 1; else return s = 0; } }

  • C言語で戻り値を使った正方形の面積と直方体の体積の表示について分からず

    C言語で戻り値を使った正方形の面積と直方体の体積の表示について分からずに困っています。 C言語ラストの問題が一番難しくて、全然分からずに困っています。 以下の点に留意して、一辺の長さを入力すると、正方形の面積と直方体の体積を計算するプログラムを作成する。main内 1)整数型の変数length、men、taiを宣言する。 2)実行例と同様の表示になるように、“一辺の長さを入力してください。”を表示し、入力された値を、変数lengthに読み込む。 3)作成する関数名は、titleとし、lengthを引数とし、関数titleを使う。 4)正方形の面積を計算する関数の関数名は、squareとし、lengthを引数とし、戻り値をmen に代入する。 5)直方体の体積を計算する関数の関数名は、qubeとし、lengthを引数とし、戻り値をtai に代入する。 6)“一辺○○の正方形の面積は ○○です。”と表示する。 7)“一辺○○の直方体の体積は ○○です。”と表示する。 関数title内 1)引数を変数名xとする。 2)下記の実行例の様になるように、表示を行う。 関数square内 1)引数を変数名xとする。 2)整数型の変数valを宣言する。 3)正方形の面積を計算し、valに代入する。 4)valの内容が戻り値となるようにする。 関数qube内 1)引数を変数名xとする。 2)整数型の変数valを宣言する。 3)直方体の体積を計算し、valに代入する。 4)valの内容が戻り値となるようにする。 という問題です。 考えて作ってみたのが下のですが、間違いだらけでどうしようもありません。 #include <stdio.h> void main(void) { int length,men,tai; printf("一辺の長さを入力してください。\n"); scanf("%d",&length); men=square(length); tai=qube(length); printf("***********************************\n"); printf("* 一辺%d *,&lenght); printf("*正方形の面積*") printf("*直方体の体積*") printf("*を計算します。*") printf("*************************\n"); } int square(x) { int val; val=x*x; return val; } int qube(y) { int val; val=x*x*x return val; } どなたかよかったら教えてください。 よろしくお願いします。

  • C言語 プログラミングで行詰まりました…

    標準入力(キーボード)からi,jk,nの値を入力し、次の漸化式を計算し、X_0からX_nまで求めるプログラムを作成したいのですが、うまく表示されません。どかがおかしいのかご指摘お願いします。 <漸化式> X_n=(a+b)/X_(n-1) , X_0=c(n=0) ================================================================== #include<stdio.h> float f_X(int a,int b,float c) { float y; y=(a+b)/c; return y; } int main (void) { int number,i,j; float k,l,n,X; printf("i:"); scanf("%d", &i); printf("j:"); scanf("%d", &j); printf("k:"); scanf("%f", &k); printf("n:"); scanf("%f", &n); X=k; printf("X_0= %.6f\n",X); for(number=1;number<=n;number++) { l=f_X(i,j,X); printf("X_%d= %.6f \n",number,l); X=l; } return 0; } ===================================================================

  • C言語なんですがうまくうごきません。

    X=1においてX^nをm回微分した値を求めるプログラムを作っているのですが、 何度も考えて訂正したりしてるのですが、どこが悪いのかわかりません 再帰関数を使ってます。 デバッグして調べてみてるのですが、うまくいってるようにみえるのですが、最後の値が0になります。 nを大きい値にすると、マイナスになったりするんです。 よくわかりません。 ちなみにnとmは正で、mは10までの数を入力します。 このプログラムの基本形を変えないで問題改善することはできるのでしょうか? わかる人いましたら教えてください。 #include <stdio.h> double differentiate(double n, int m); int main(void) { int a, b; printf("Input 2 number\n"); fflush(stdout); scanf("%d %d", &a, &b); printf( "a = %d\nb = %d\n", a, b ); printf("Answer = %d\n", differentiate(a, b)); return 0; } } double differentiate(double n, int m) { if(m == 1){ return n; }else{ return n * n-1 * differentiate(n-1, m-1); } }

  • c言語について

    #include <stdio.h> MakeData(int *a,int n){ int i,b[5]={5,1,4,7,2}; for(i=0;i<5;i++){a[i]=b[i];} } BubbleSort(int n,int *a){ ここに流れ図に沿ったプログラムを作る } main(){ int i,n,a[100]; n=5; MakeData(a,n); for(i=0;i<n;i++){printf("%4d ",a[i]);}printf("¥n"); printf("並べ替え後¥n"); BubbleSort(n,a); for(i=0;i<n;i++){printf("%4d ",a[i]);}printf("¥n"); } この課題が分かりません。 もし詳しい方がいらっしゃいましたら教えて頂けると助かります。

  • C言語の配列の入れ方について質問です。

    下記のプログラムで1234という連続した数字を入れたら配列val[0]~[3]に val[0] = 1 val[1] = 2 val[2] = 3 val[3] = 4 というように入れたいのですが、どのようにして別々にすれば良いですか?宜しくお願いします。 #include<stdio.h> int main(void) { int num[10]; int val[4]; int i; printf("式:"); scanf("%d",num); for(i=0;i<4;i++){ val[i] = 0; } for(i=0; i<4; i++){ if((num[i] >= 1) && (num[i] <= 9)){ /*1から9の数値が入ったならば*/ val[i] = num[i]; } } for(i=0; i<4; i++){ printf("答え%d:%d\n",i,val[i]); } }

  • C言語プログラム 配列

    C言語プログラム初心者です。以下のプログラムに対して、実行結果がなぜそうなるかがわからないので、詳しく教えてください。 #include<stdio.h> int func(int a[ ],int b[ ],int n); main(){ int i,k; static int a[12] ={1,2,3,4,5,(省略)・・・,12};  static int b[12] ={21,22,23,24,(省略)・・・,32}; k = func(a,b,6); k = func(b+3,a+3,6); printf("a = "); for(i=0;i<12;i++)printf("%d",a[i]); printf("\n = b"); for(i=0;i<12;i++)printf("%d",b[i]); printf("\n k = %d\n",k); } int func(int a[ ],int b[ ],int n){ int i,x=0; for(i=0;i<n;i++);{ a[i] = b[i]; x = x+a[i]; } return(x); } 結果: a = 21 22 23 .... 26 7 8 9 10 11 12 b = 21 22 23 .... 26 7 8 9 30 31 32 k = 99

  • C言語のscanf文について

    C++言語の勉強中で、ビット演算子のところで質問です。 動作は、キーボードから16進データを入力して、そのデータの3,4ビット目を0にした時のデータを算出するというものです。 ここでProgram中の scanf 文にてエラーが出てしまいます。 ①%X(16進数)の型がintに対して、ope変数がcharとなっている。  ⇒ここの整合を取るためにはどういう方法がありますでしょうか? 以下がProgramです。 /*************************************************************/ /* プログラム:ビット演算子 */ /* 動作内容 :ビット演算子によりビット操作する */ /* 入力データの3,4ビット目を0にした値を算出する */ /**************************************************************/ #include<stdio.h> int main(void) { unsigned char ope; unsigned char ans; printf(" Hex-Data : "); scanf("%X", &ope); printf(" ope : 0x%02X\n", ope); ans = ope & 0xe7; /* 3,4ビット目:0 */ printf(" ope & 0xe7 = 0x%02x\n", ans); getchar(); getchar(); return(0); }

  • C言語のプログラミングについて質問です。

    以下の文を出力して入力:に16進数を入れると10進数に変換した数値の小さい列順に並ぶプログラムを作りたいのですがうまく出来ません。 仕様は以下に記載します。 入力:__、__、__、__、__EnterKeyで結果を表示。 以下のバブルソートの文のどこをいじれば良いでしょうか? 返答宜しくお願いします。 #include <stdio.h> int main (void) { char data[256]; int val[100]; int i = 0; int work; int j; int k; printf("入力 = "); scanf("%s",data); for(i=0;i<100;i++){ val[i] = 0; } k=0; for(i = 0;i<100 ; i++){ if(data[i] == 0x00){ //data[i]がNULLだったら処理を抜ける k++; break; //enterキーでprintf出力 } else if(data[i] == ','){ //カンマだったら /*printf("%d\n",k);*/ k++; } else{ if(data[i] >= 'A' && data[i] <= 'Z'){ //data[i]にAからZが入ったら val[k] = val[k] *16 + data[i] -'A'+10; } else if(data[i] >= '0' && data[i] <= '9'){ //data[i]に0から9が入ったら val[k] = val[k] *16 + data[i] -'0'; } } } /* printf("k=%d\n",k); for(i=0;i<k;i++){ printf("出力 = %d\n",val[i]); } */ //バブルソート//     for(i=0; i<k-1; i++) { if(val[i] < val[i+1]) { } else{ work = val[i]; val[i] = val[i+1]; val[i+1] = work; } } for(i=0;i<k;i++) { printf("出力 = %d\n",val[i]); } }