arrays - 指向数组的指针
问题描述
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)
为什么这里引用空指针不会导致段错误?
解决方案
那是因为这是未定义的行为,任何编译器甚至不同版本的编译器都可能发生任何事情。
您正在使用 gcc,而 gcc 生成的代码只是将 NULL(零)移动到没有段错误的 rax。
mov QWORD PTR [rbp-8], 0
mov rax, QWORD PTR [rbp-8]
mov QWORD PTR [rbp-16], rax
您可以在以下位置查看具有不同版本 gcc 的 C 程序的汇编程序输出
推荐阅读
- c# - JSON Deserialise 处理 Array 但不喜欢单个“对象”
- hash - 如何获取哈希的数值?
- python - for-Loop 在 DataFrame 中使用 seaborn 创建 LinePlot
- python - 在 Python 中:这是什么类型的数据结构,如何将其保存到文件中?
- ios - 好的,所以我是 Swift 的新手。我一直在尝试制作一个音频播放器,而代码只是给了我这个错误。我能做些什么?
- kivy - ActionBar 抱怨 ActionSeparator 已经有一个父母
- java - 如何将结果集存储在列表中并在 HQL 语句中使用实体的属性迭代列表?
- c# - 单击syncfusion blazor中的NavLink项目时如何弹出模式?
- c++ - 在 C++20 之前,使用 const 或引用字段在 `A` 上调用`std::vector ::data()`
- javascript - VSCode 扩展直接使用多步输入