繁体   English   中英

为什么这段代码打印地址?

[英]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
  • 使用Microsoft Visual Studio选项/W3/W4

gccclang会抱怨数组arr的草率初始化程序。 它应该是:

int arr[2][3] = { { 1, 2, 3 }, { 4, 5, 6 } };

打印循环确实令人惊讶,你真的想用一个循环打印数组吗?

另请注意,不带参数的main的标准原型是int main(void)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM