【发布时间】:2021-04-28 14:27:18
【问题描述】:
我试图更好地理解指针和数组,但偶然发现了一个我无法理解的示例
#include <stdio.h>
int main () {
char s[] = "bear";
char(*a)[4] = &s;
char(*b)[3] = &s;
char(*c)[2] = &s;
char(*d)[1] = &s;
printf("%c%c%c%c\n", a[0][0], b[0][1], c[1][0], d[2][1]);
system("pause");
return 0;
}
运行代码我得到“b e a r”
我理解它的方式每一行都说“这是一个 x 长度的字符数组,它的第一个元素是这个 (&s)”,当搜索超出数组范围的内容时,它将解释下一个字符串内存中的数据作为另一个数组(可能会或可能不会给出未定义的行为,具体取决于那里写入的内容)。
所以:
b e a r
b:
b e a
r
c:
b e
a r
d:
b
e
一个
r
行的位置是[x][],列的位置是[][x]
除了d[2][1].之外的所有东西都检查出来
d 只有一列d[x][0],我希望在到达d[2][1] 时会出现分段错误或未定义的行为,就像我运行b[1][2] 时一样,但“r”是打印。这是为什么呢?
【问题讨论】: