首页 > 解决方案 > 指向数组的指针

问题描述

int (*a)[10] = NULL; // initilaized to NULL pointer

printf("a  :: %p\n", a); // print nil
printf("*a :: %p\n", *a); // seg fault??

return 0;

我使用 gcc 在我的 x86 代码上执行了这段代码,它编译时没有任何错误。
我期待像

a :: (nil)
分段错误

但它实际上打印出来

a :: (nil)
*a :: (nil)

为什么这里引用空指针不会导致段错误?

标签: arrayscpointerssegmentation-fault

解决方案


那是因为这是未定义的行为,任何编译器甚至不同版本的编译器都可能发生任何事情。

您正在使用 gcc,而 gcc 生成的代码只是将 NULL(零)移动到没有段错误的 rax。

mov     QWORD PTR [rbp-8], 0
mov     rax, QWORD PTR [rbp-8]
mov     QWORD PTR [rbp-16], rax

您可以在以下位置查看具有不同版本 gcc 的 C 程序的汇编程序输出

https://godbolt.org/


推荐阅读