質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

Q&A

解決済

2回答

1366閲覧

unionのメモリ配置について

Hiro10

総合スコア7

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

プログラミング言語

プログラミング言語はパソコン上で実行することができるソースコードを記述する為に扱う言語の総称です。

0グッド

0クリップ

投稿2020/07/13 09:45

はじめに

プログラミング初心者で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

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

union1: 16 byte
union1: 0x10475e018
union2: 16 byte
union2: 0x10475e028

アドレスが16進数で表示されています。差の0x10は10進数で言うと16バイトです。

投稿2020/07/13 09:51

編集2020/07/13 09:54
hidezzz

総合スコア1248

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Hiro10

2020/07/13 13:21

先頭に0xが付くと16進数表記になるのですね!勉強になりました...ありがとうございます!
guest

0

10バイト差、ではなく、0x10バイト差、ですね。
10進数でいうと16バイトになります

unionの中にlong変数が入っているために、8バイト単位のパディングが入ることになります
#64ビットCPUというのがそこらへんに効いてきてそうですね

投稿2020/07/13 10:47

編集2020/07/13 10:50
y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問