![](/img/trans.png)
[英]Why does this simple C code print the addresses in the reverse order ? (For Ex. 4214868 4214864)
[英]Why does this code print addresses?
为什么在意外打印2D阵列的一个维度时没有出现编译时错误?
#include <stdio.h>
void main() {
int i;
int arr[2][3] = { 1, 2, 3, 4, 5, 6 }; //<- Declared a 2D array
for (i = 0; i < 6; i++) {
printf("%d\n", arr[i]); // <- Accidently forgot a dimension
}
}
我应该收到编译时错误,但我得到了一组地址! 为什么? arr[0]
在这个上下文中对编译器意味着什么?
数组类型的表达式求值为大多数上下文中指向第一个数组元素的指针 (一个值得注意的例外,其中一个是sizeof
运算符)。
在您的示例中, arr[i]
具有数组类型。 所以它计算为int (*)[]
类型的指针(指向数组的指针)。 这就是印刷品。 使用%d
打印指针是未定义的行为 ,因为printf()
将读取指针,就好像它是一个int
。
Felix Palmen的回答解释了观察到的行为。
关于你的第二个问题:你没有得到警告的原因是你没有要求他们。
众所周知,编译器在默认情况下是宽松的,并且会接受包含明显未定义行为的损坏代码。 这个特殊的一个并不明显,因为printf()
在初始格式字符串之后接受任意数量的额外参数。
您可以指示编译器发出许多有用的警告,以避免愚蠢的错误并检测非明显的编程错误。
gcc -Wall -Wextra -Werror
clang -Weverything -Werror
/W3
或/W4
。 gcc
和clang
会抱怨数组arr
的草率初始化程序。 它应该是:
int arr[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };
打印循环确实令人惊讶,你真的想用一个循环打印数组吗?
另请注意,不带参数的main
的标准原型是int main(void)
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.