【发布时间】:2019-07-18 04:55:25
【问题描述】:
以下说法是否相同?
char *PTR='\0';
&
char *PTR=NULL;
【问题讨论】:
以下说法是否相同?
char *PTR='\0';
&
char *PTR=NULL;
【问题讨论】:
不小心,是的。
'\0'是一个ASCII码为0的字符;因此,它是一个值为 0 的整数。NULL 通常也是一个值为 0 的整数。它们通常具有不同的大小,但编译器会在这种情况下识别出这一点,因此在这两种情况下,PTR 都以一个空指针(即值为 0 的指针)。
如果你用双引号写了char *PTR="\0";,情况就完全不同了:"\0" 将被分配为一个双字符数组,两个字符都是 ASCII 0。PTR 将被初始化为指向两个零中的第一个。
【讨论】:
'\0' 是一个值为零的字符常量。是否为 ASCII 取决于实现。 (b) NULL“通常”不是一个值为零的整数。根据 C 标准,它可以是值为零的整数常量表达式,也可以是转换为 void * 的表达式。 (c) 用不同大小来推理表达式是错误的。 C 的语义是根据类型定义的,即使大小相同,也存在类型兼容性和规则的问题。
不,它们不是,尽管它们会产生相同的结果。 '\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
【讨论】:
NULL可以是0或者(void*)0。
\0 是一个 int,与任何其他字符文字相同。所以这只是写0的另一种方式。
NULL。或一般的指针,不限于 64 位或 32 位值。向学生传达类型语义比根据宽度区分值更好。从指针到char 的转换将是一个问题,这是由于关于转换类型的规则,而不是由于任何关于将 64 位值转换为 8 位值的规则。 nullptr 是 C++,而不是 C。
NULL 是一个宏。所以这取决于它的定义是什么。通常NULL只是0。
这里已经不错了answer
【讨论】:
NULL必须是0或(void*)0。
#define NULL ((void*)42) 会发出警告,但会起作用(直到发生不好的事情)。
NULL 将始终为 0,但这并不意味着您遇到的任何 NULL 都可以保证是(尽管可能是恶意、混淆 C 代码竞赛或极端白痴导致它发生)。