【问题标题】:Is assigning '\0' to a pointer is same as assigning NULL to it? [duplicate]将 '\0' 分配给指针是否与分配 NULL 相同? [复制]
【发布时间】:2019-07-18 04:55:25
【问题描述】:

以下说法是否相同?

char *PTR='\0';

&

char *PTR=NULL;

【问题讨论】:

    标签: c pointers


    【解决方案1】:

    不小心,是的。

    '\0'是一个ASCII码为0的字符;因此,它是一个值为 0 的整数。NULL 通常也是一个值为 0 的整数。它们通常具有不同的大小,但编译器会在这种情况下识别出这一点,因此在这两种情况下,PTR 都以一个空指针(即值为 0 的指针)。

    如果你用双引号写了char *PTR="\0";,情况就完全不同了:"\0" 将被分配为一个双字符数组,两个字符都是 ASCII 0。PTR 将被初始化为指向两个零中的第一个。

    【讨论】:

    • (a) '\0' 是一个值为零的字符常量。是否为 ASCII 取决于实现。 (b) NULL“通常”不是一个值为零的整数。根据 C 标准,它可以是值为零的整数常量表达式,也可以是转换为 void * 的表达式。 (c) 用不同大小来推理表达式是错误的。 C 的语义是根据类型定义的,即使大小相同,也存在类型兼容性和规则的问题。
    • @EricPostpischil:a)我说 ASCII 0 是为了将其与 ASCII 48 区分开来,因为说“零”是令人困惑的。 b) 是的,应该是。 c) 你是对的。
    【解决方案2】:

    不,它们不是,尽管它们会产生相同的结果。 '\0' 是一个单字节字符,我们将其用作字符串上的空终止字符。 NULL 是 (void*)0,它是一个指针,是一个 64 位值(或 32 位,具体取决于架构)。您最好使用 NULL(或 nullptr)作为指针值,并保留 '\0' 作为终止字符串的一种方式。尽管如此,将 '\0' 转换为指针应该没问题。换一种方式可能会产生警告(将 64 位值转换为 8 位值)。

    char *PTR = '\0';
    char CHAR = '\0';
    
    char *PTR = NULL;
    char CHAR = NULL;  ///< will generate a warning
    

    【讨论】:

    • Re "NULL is (void)0*",根据thisNULL可以是0或者(void*)0
    • 在 C 中,\0 是一个 int,与任何其他字符文字相同。所以这只是写0的另一种方式。
    • NULL。或一般的指针,不限于 64 位或 32 位值。向学生传达类型语义比根据宽度区分值更好。从指针到char 的转换将是一个问题,这是由于关于转换类型的规则,而不是由于任何关于将 64 位值转换为 8 位值的规则。 nullptr 是 C++,而不是 C。
    【解决方案3】:

    NULL 是一个宏。所以这取决于它的定义是什么。通常NULL只是0。

    这里已经不错了answer

    【讨论】:

    • 根据thisNULL必须是0(void*)0
    • @ikegami: #define NULL ((void*)42) 会发出警告,但会起作用(直到发生不好的事情)。
    • @Amadan,是的,编译器提供它是非法的。您没有访问我提供的链接吗?
    • @ikegami 我并不是要让编译器提供它。一个愚蠢的程序员可以。 编译器的 NULL 将始终为 0,但这并不意味着您遇到的任何 NULL 都可以保证是(尽管可能是恶意、混淆 C 代码竞赛或极端白痴导致它发生)。
    • @ikegami 是的,感谢您的澄清
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-10
    • 1970-01-01
    • 2015-01-12
    • 1970-01-01
    • 2017-02-02
    相关资源
    最近更新 更多