【问题标题】:Using the null terminating character as null pointer in C [duplicate]在C中使用空终止字符作为空指针[重复]
【发布时间】:2021-08-24 03:04:10
【问题描述】:
#include <stdio.h>

int main(){
 int *p = '\0';
 if (p == NULL){
   // this block will get executed.
 }
 return 0;
}

我读过0NULL\0 都等于C 中的整数常量0。 那么上面的代码在设置和检查 NULL 指针方面在技术上是正确的吗?我想它仍然需要避免,因为\0 主要用于终止字符串,它的用法在这里令人困惑?

【问题讨论】:

  • 我认为答案是肯定的:字符常量'\0'是一个值为零的整数常量,因此它作为空指针常量是有效的。所以int *p = '\0'; 确实应该将p 初始化为空指针。我觉得我以前在这个网站上看到过这个问题,但还没有找到重复的问题。无论如何,这在风格上肯定很糟糕。
  • 创建宏 NULL 是因为当时并非所有硬件都使用“零”作为空指针。 C 很晚才采用 C++ 中的“整数零表示空指针”概念。

标签: c


【解决方案1】:

'\0' 是一个整数零。

所有三个都完全相同。

int *p = NULL;
int *p = 0;
int *p = '\0'; 

但最后两个可能会发出警告。

【讨论】:

    【解决方案2】:

    最好的描述方式是指针可以是一个,表明它在功能上没有指向任何东西(这是不正确的:它实际上是指向内存点零)。但是有很多方法可以表示零,NULL 就是其中一种。所以从技术上讲,只要编译器将其解释为“零”,您编写零的任何方式在技术上都是合法的。

    仅供参考,有些人将if 语句反向编写以防止在您忘记等号时意外分配:

    if (NULL == p){
    

    【讨论】:

    • if (NULL == p) { 不再有用而且相当丑陋恕我直言,具有适当警告级别的现代编译器将对if (p = NULL) { 发出警告。也可以写if (!p) {
    • 这是真的,除非你为几乎所有编译器编写代码(我们开发的开源包确实是针对的),而且我发现太多的开发人员忽略了警告(叹气)。因此,它在某些语言(例如 python)中是不允许的,这也是令人沮丧的原因。
    • 更令我沮丧的是 Python 中缺少 i++。忽略警告或未能启用警告的开发人员应该为寻找隐藏在视线中的愚蠢错误而痛苦。即使在使用笨重的编译器进行交叉编译时,使用适当的工具添加 lint 目标也是可行的。你的照片很棒:)
    • 完全同意。哇...非常感谢您的照片评论!
    【解决方案3】:
    int *p = '\0';
    

    告诉p 是一个整数指针,指向一个数字为零的字符。编译器会为您将此字符转换为数字文字,可能会发出警告。由于您没有为p 分配内存来指向,这可能会给您一个段错误。 在p == NULL 中,您不是在比较p 指向的内容(您可能分配的任何值),而是p 本身的值,即指针指向的地址。

    【讨论】:

    • 没有。 p 确实 not 指向一个为零的字符。该语句将零的分配给指针。
    • 我不这么认为,'\0' 在 C 中等于 NULL,不是字符。
    猜你喜欢
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    • 2021-03-29
    • 2012-01-02
    • 1970-01-01
    相关资源
    最近更新 更多