このブログは、旧・はてなダイアリー「檜山正幸のキマイラ飼育記 メモ編」(http://d.hatena.ne.jp/m-hiyama-memo/)のデータを移行・保存したものであり、今後(2019年1月以降)更新の予定はありません。

今後の更新は、新しいブログ http://m-hiyama-memo.hatenablog.com/ で行います。

配列

  • 先入観、思いこみ、つまらない(事実とは異なる)推測は徹底的に捨てよう!
  • 余計なことは考えない。ただひたすら、メモリ状況の(事実に即した)絵を描くのみ。

内部の状態(メモリレイアウト)と出力の意味を説明せよ。


#include

char a0[] = {'a', 'b', 'c', 'd', 'e', '\0'};
char a1[] = {'v', 'w', 'x', 'y', 'z', '\0'};
char* a[] = {a0, a1};

char *b[] = {"abcde", "uwxyz"};

char c[][6] = {{'a', 'b', 'c', 'd', 'e', '\0'},
{'v', 'w', 'x', 'y', 'z', '\0'}};

char d[][6] = {'a', 'b', 'c', 'd', 'e', '\0',
'v', 'w', 'x', 'y', 'z', '\0'};

char e[] = {'a', 'b', 'c', 'd', 'e', '\0',
'v', 'w', 'x', 'y', 'z', '\0'};

// メモリブロックをダンプする関数
void dumpmem(unsigned char *p, unsigned size)
{
static int hex[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F'};

unsigned char *bound;
int u;
for (bound = p + size; p < bound; p++) {
u = *p;
putchar(hex[(u&0xF0)>>4]); // 上位ニブル
putchar(hex[u&0x0F]); // 下位ニブル
putchar(';'); // 1バイトの終わりを示す
};
}

main()
{
// a
printf("a addr=%p size=%d\n", a, sizeof(a));
dumpmem(a, sizeof(a)) ;
// b
printf("\n\nb addr=%p size=%d\n", b, sizeof(b));
dumpmem(b, sizeof(b));
// c
printf("\n\nc addr=%p size=%d\n", c, sizeof(c));
dumpmem(c, sizeof(c));
// d
printf("\n\nd addr=%p size=%d\n", d, sizeof(d));
dumpmem(d, sizeof(d));
// e
printf("\n\ne addr=%p size=%d\n", e, sizeof(e));
dumpmem(e, sizeof(e));
putchar('\n');
}

どこがなぜコンパイルエラーするのか? どうしたらコンパイラが通るか? 動いたときの出力(表示)の意味は?


#include

int a[] = {1, 2, 3, 4};

main()
{
printf("&1 = %p\n", &1);
printf("a = %p\n", a);
printf("&a = %p\n", &a);
a++;
printf("a = %p\n", a);
a = 0;
printf("a = %p\n", a);
}