配列
- 先入観、思いこみ、つまらない(事実とは異なる)推測は徹底的に捨てよう!
- 余計なことは考えない。ただひたすら、メモリ状況の(事実に即した)絵を描くのみ。
内部の状態(メモリレイアウト)と出力の意味を説明せよ。
#includechar 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');
}
どこがなぜコンパイルエラーするのか? どうしたらコンパイラが通るか? 動いたときの出力(表示)の意味は?
#includeint 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);
}