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

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

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

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

Q&A

解決済

4回答

1344閲覧

メモリアドレスの格納方式について理解できてません。

apeirogon0813

総合スコア117

C

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

0グッド

1クリップ

投稿2019/07/09 11:46

C

1#include<stdio.h> 2 3int a[10] = {-1, 23, -34, 45, 5, 6, 7, 8, 9, 10}; 4 5int main(void) { 6 int i, sum = 0; 7 printf("a = %08x\n",a); 8 for(i=0;i<10;i++) { 9 sum += a[i]; 10 } 11 printf("sum = %d\n",sum); 12 return 0; 13}

上記の
printf("a = %08x\n",a); (出力: a = 1058a7bc)
を実行した直後の16進数で表したメモリアドレス上の値を埋めよ(intは32ビットの整数であることに注意)という問題なのですがイメージ説明

空欄はfor文内のsumに代入された値が格納されていくということはわかりましたが、
(1) sum=0;と初期化した場合の16進数は00000000だと思うのですが,ffffffffとなるのはなぜでしょうか。

(2) 32ビットのアドレスに8ビット(1バイト)の値しか格納できないのはどうしてなのでしょうか。

(3) 同じ変数に何度も代入されるとしても毎回新しいメモリのアドレスに格納されていくのでしょうか。

多くなってしまいましたが、ご教示願います。

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

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

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

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

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

guest

回答4

0

C

1#include <stdio.h> 2 3int a[10] = { -1, 23, -34, 45, 5, 6, 7, 8, 9, 10 }; 4 5int main(void) 6{ 7 int i, sum = 0; 8 printf("a = %p\n", a); 9 unsigned char *p = (unsigned char *)a; 10 for (int i = 0; i < 10; i++) { 11 printf("%p:", p); 12 for (int j = 0; j < 4; j++) printf(" %02x", *p++); 13 printf(" a[%d] = %d\n", i, a[i]); 14 } 15 for (i = 0; i < 10; i++) { 16 sum += a[i]; 17 } 18 printf("sum = %d\n", sum); 19 return 0; 20}

リトルエンディアンでの実行結果

text

1a = 0x601060 20x601060: ff ff ff ff a[0] = -1 30x601064: 17 00 00 00 a[1] = 23 40x601068: de ff ff ff a[2] = -34 50x60106c: 2d 00 00 00 a[3] = 45 60x601070: 05 00 00 00 a[4] = 5 70x601074: 06 00 00 00 a[5] = 6 80x601078: 07 00 00 00 a[6] = 7 90x60107c: 08 00 00 00 a[7] = 8 100x601080: 09 00 00 00 a[8] = 9 110x601084: 0a 00 00 00 a[9] = 10 12sum = 78

すなわち、アドレスをバイト単位で逆に書くと

text

1address BE LE 260106b de ff 360106a ff ff 4601069 ff ff 5601068 ff de 6601067 17 00 7601066 00 00 8601065 00 00 9601064 00 17 10601063 ff ff 11601062 ff ff 12601061 ff ff 13601060 ff ff

投稿2019/07/09 15:10

kazuma-s

総合スコア8224

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

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

apeirogon0813

2019/07/09 16:02

ご丁寧にありがとうございます。
guest

0

ベストアンサー

(1) sum=0;と初期化した場合

質問の主旨からして、a の値(正確には a[0])ですね。で、メモリアドレス表の値が ffffffff となっている、という事でしょうか。
ソースの最初に int a[10] = {-1, 23, ...} あるので、その最初の値は、-1。 これを 16進数に直すとそうなりませんか?

(2) 32ビットのアドレスに8ビット(1バイト)の値しか

これは、epistemeさんの回答の通り。まあ、ここに 32bitの値を書いても良いですが、一つのアドレスは、8bitなので、残りは次のアドレスに入ります。
(16bit, 32bit アドレスの CPUもありますが、ここでは考慮しません)

(3) 同じ変数に何度も代入されるとしても毎回新しいメモリのアドレス

C言語の場合、ありません。関数内で宣言されるローカル変数の場合、関数が呼ばれる毎に、異なるアドレスになる事がありますが、一回の呼び出しではありえません。

投稿2019/07/09 14:44

pepperleaf

総合スコア6383

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

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

apeirogon0813

2019/07/09 16:03

ご丁寧にありがとうございます。3番はsumの値がアドレスに更新されて格納されていると勘違いしておりました。
guest

0

sumの事は忘れて、
int a[10] = {-1, 23, -34, 45, 5, 6, 7, 8, 9, 10};

printf("a = %08x\n",a); (出力: a = 1058a7bc)
だけを見て考えましょう。

なぜまsumが関係あると思ったのか不思議です。

投稿2019/07/09 12:13

otn

総合スコア84423

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

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

guest

0

(1) sum=0;と初期化した場合の16進数は00000000だと思うのですが,ffffffffとなるのはなぜでしょうか。

printfしてるのは a の値。何故にsumがffffffffだと?

(2) 32ビットのアドレスに8ビット(1バイト)の値しか格納できないのはどうしてなのでしょうか。

アドレスは文字通り住所。その住所にあるのが一軒家か高層マンションかは関係ない。
アドレスはメモリ上の位置を示すのだから、メモリの単位がbyteなら一つのアドレスが示すのはbyte。

(3) 同じ変数に何度も代入されるとしても毎回新しいメモリのアドレスに格納されていくのでしょうか。

何故にそう考える?

投稿2019/07/09 11:53

編集2019/07/09 11:56
episteme

総合スコア16614

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

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

apeirogon0813

2019/07/09 15:59

すみません、for文でaの代入されたsumの値が毎回新しいアドレスに格納されていっているのだと勘違いしていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問