food配列と各文字列のメモリ上の配置を図示します。
char * food[7];
はポインタが7個ある配列です。64bitマシンはポインタ(アドレス)に64ビット必要なので、ポインタのサイズは8(8バイト)です。food[0] ~ food[6] 全てがポインタです。当然、いずれもサイズは8です。
- 各文字列、UTF-8だと漢字一文字は大抵3バイトです。「とりにく」の「と」も「り」も3バイト、そして文字列の最後にはターミネータ
'\0'
の1バイトがあります。アスキー文字(英数字記号等)は一文字1バイトですから、各文字列の長さは文字列に応じて1バイト単位で変化します。
- food[0] ~ food[6] は各文字列をポイントしている=food[0] ~ food[6] の値は各文字列の先頭アドレスです。
メモリ上のデータ配置と値を直接見る手段はメモリダンプです。私の手元でやってみた結果を記します(GCC on Ubuntu)。手描きの図とメモリダンプを対応させてご覧ください。具体的なメモリアドレスは同じではないとしても、質問者のところでも同様のメモリ配置になっていると思います。
bash
1rubato$ cc 3tdqdpg4d3gaxu.c mdump-utf8.c
2rubato$ ./a.out
3配列1個のメモリサイズ 8, strlen = 12
4配列1個のメモリサイズ 8, strlen = 15
5配列1個のメモリサイズ 8, strlen = 9
6配列1個のメモリサイズ 8, strlen = 12
7配列1個のメモリサイズ 8, strlen = 15
8配列1個のメモリサイズ 8, strlen = 12
9配列1個のメモリサイズ 8, strlen = 9
10 'char * food[7]'
110x7ffddaa7cef0: 08 20 01 f9 53 56 00 00 15 20 01 f9 53 56 00 00 . ..SV... ..SV..
120x7ffddaa7cf00: 25 20 01 f9 53 56 00 00 2f 20 01 f9 53 56 00 00 % ..SV../ ..SV..
130x7ffddaa7cf10: 3c 20 01 f9 53 56 00 00 4c 20 01 f9 53 56 00 00 < ..SV..L ..SV..
140x7ffddaa7cf20: 59 20 01 f9 53 56 00 00 00 25 ec 8a 9e 57 5c fa Y ..SV...%슞 W\.
15 'food[0] .. food[6]'
160x5653f9012008: e3 81 a8 e3 82 8a e3 81 ab e3 81 8f 00 e3 82 ab と り に く .カ
170x5653f9012018: e3 83 ac e3 83 bc e3 83 ab e3 83 bc 00 e3 83 a9 レ ー ル ー .ラ
180x5653f9012028: e3 82 a4 e3 82 b9 00 e3 81 b6 e3 81 9f e3 81 ab イ ス .ぶ た に
190x5653f9012038: e3 81 8f 00 e3 81 8b e3 81 9f e3 81 8f e3 82 8a く .か た く り
200x5653f9012048: e3 81 93 00 e3 81 ab e3 82 93 e3 81 98 e3 82 93 こ .に ん じ ん
210x5653f9012058: 00 e3 83 88 e3 83 9e e3 83 88 00 00 00 00 00 00 .ト マ ト ......
220x5653f9012068: e9 85 8d e5 88 97 ef bc 91 e5 80 8b e3 81 ae e3 配 列 1 個 の メ
プログラムの main() 関数を次のように少し変えました。mdump() 関数は省略します。
C
1#include <stdio.h>
2#include <string.h>
3void mdump(void * addr, int size, char * title);
4
5int main(void) {
6 char * food[7] = {
7 "とりにく", "カレールー", "ライス", "ぶたにく",
8 "かたくりこ", "にんじん", "トマト"
9 };
10 for (int i = 0; i < 7; i++) {
11 printf("配列1個のメモリサイズ %ld, strlen = %ld\n",
12 sizeof food[i], strlen(food[i]));
13 }
14 mdump(food, sizeof(food), "char * food[7]");
15 mdump(food[0], 16 * 7, "food[0] .. food[6]");
16}
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/01/22 12:47