はじめに
プログラミング初心者でc言語の勉強をしています。現在unionについて勉強しているのですが、unionの使用するメモリ領域についてお聞きしたいことがあります。
下のようなプログラムをコンパイルし実行すると、u1、u2のサイズは16バイトになります。構造体と同じようにパディングが入っているため10バイトではなく16バイトになるのはわかるのですが、アドレスを確認するとu1とu2の間には10バイトしかありません。
これではu1の残りの6バイト分のパディングがu2と重なってしまっているように思えるのですが、これはただこの状況でパディングの意味がないため、パディングよりメモリ節約が優先されて、パディングが消えてその上にu2が領域を確保しているだけなのでしょうか。
sizeof()では16バイトなのに、アドレスを確認すると重なっているように感じてしまうためいまいちしっくりきません。
どうしてこのような挙動になるのか教えていただけないでしょうか。よろしくお願いします。
出力結果
union1: 16 byte union1: 0x10475e018 union2: 16 byte union2: 0x10475e028
該当のソースコード
c
1#include <stdio.h> 2union u_tag{ 3 int ival; 4 long lval; 5 char sval[10]; 6}u1,u2; 7 8int main(void){ 9 printf("union1: %lu byte\n", sizeof(u1)); 10 printf("union1: %p\n", &u1); 11 12 printf("union2: %lu byte\n", sizeof(u2)); 13 printf("union2: %p\n", &u2); 14 return 0; 15} 16
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/07/13 13:21