【问题标题】:Try to access data through null address in C? [duplicate]尝试通过C中的空地址访问数据? [复制]
【发布时间】:2019-03-22 01:49:29
【问题描述】:

只是一个奇怪的问题。如果我尝试从具有NULL 值的地址访问数据会发生什么。 例如:如果我有一个存储NULL 的结构指针ulog 并且编译器(在我的情况下是GCC)遇到ulog->data=12

我主要想知道这是否会影响我的记忆,与控制语句一起使用时是否返回 NULL 以及编译器出了什么问题?

【问题讨论】:

  • 编译器不会/不需要抱怨。在运行时,程序将因段错误而中止。
  • 取消引用空指针会导致undefined behavior,如果使用指针写入一些数据(如在您的示例分配中),那么您很可能会崩溃。 总是检查指针。
  • 编译器不在乎,你是程序员……操作系统肯定会很失望……

标签: c memory-management struct


【解决方案1】:

清除条款:

  • NULL 是一个空指针常量 (7.19/3)。
  • 空指针常量是值0(void*)0 (6.3.2.3/3)。
  • 当空指针常量分配给任何类型的指针时,生成的指针变为 空指针,它保证与任何其他指针(指向对象或函数)比较不相等) (6.3.2.3/3)。

您无法真正知道给定系统上空指针的实际表示。如果您尝试访问它,就好像它是标准未指定的有效地址一样会发生什么 - 这是未定义的行为。

意味着任何事情都可能发生,包括分段错误、总线错误、什么都没有、程序开始异常运行等。

【讨论】:

  • @Antti Haapala 停止破坏我的帖子,去阅读 6.3.2.3/3 的实际内容:)
  • @AnttiHaapala 不,您在“对象”中编辑,而它说“对象或函数”。本质上是指任何指针类型。
  • @AnttiHaapala 很好,我添加了一些额外的文字...
【解决方案2】:

编译器不会抱怨。

但是,在运行时,您将调用 Undefined Behavior (UB),因为您取消引用 NULL 指针。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多