查看下面的声明
const char REASON_POR = "POR";
问题是,为什么REASON_POR
会被NULL
终止?
这个:
const char REASON_POR = "POR";
是错误的,因为 REASON_POR
是 char
类型的常量,并且您正在为其分配一个字符串,而您应该只分配一个字符,例如"P"。
严格来说,在 C 中没有分配字符串,而只能使用字符的地址(如果是字符串)分配指针。*
将(字符串的)指针分配给char
会调用未定义的行为。
*此规则只有一个例外 - char 表(或任何其他表或结构)的初始化:char str[]="foo";
正在复制实际字符串的地方。
字符串文本由语言定义为末尾有一个 NUL 字节。这就是为什么sizeof("POR")
等于4
,而不是3
。当编译器将字符串文本生成到输出二进制文件中时,它会安排存在 nul 字节。
如果我不得不猜测为什么 C 中的字符串以 null 结尾,那可能是因为 Dennis Ritchie 认为能够识别字符串的结尾是个好主意。许多便利功能都使用此功能工作,例如 strlen