【问题标题】:How is NULL terminated?NULL 是如何终止的?
【发布时间】:2017-10-04 23:46:55
【问题描述】:

查看下面的声明

const char REASON_POR = "POR";

问题是,为什么REASON_POR 会被NULL 终止?

【问题讨论】:

  • 什么意思?这就是 C 的工作方式。字符串文字以 null 结尾。
  • C 非常混乱。请注意,NULL(大写字母)是用作 pointer 常量的宏。但是,您追求的是完全不同的东西,即数值为零的 character。它通常拼写为'\0',但也可以使用0,有时也会使用符号“NUL”(一个“L”)。也就是说,字符串是“零终止”或“null 终止”(“null”是“零”的替代词),或者可能是 NUL 终止,但绝不是您所说的。
  • OMG "POR"char * 的类型,而不是 char

标签: c string null null-terminated


【解决方案1】:

这个:

const char REASON_POR = "POR";

错误,因为REASON_PORchar 类型的常量,并且您正在为其分配一个字符串,而您应该只分配一个字符,例如'P'。

严格来说,C中没有字符串的赋值,而是只能将指针赋值为char的地址(如果是字符串)。*

将(字符串的)指针分配给char 会调用未定义的行为


*这条规则只有一个例外 - char 表(或任何其他表或一般结构)的初始化:char str[]="foo"; 正在复制实际字符串。

【讨论】:

  • 我的大脑让我觉得 char lol 后面有一个 '*'。好收获
  • 您不能分配字符串。 C 语言中没有字符串赋值。您只能为指针分配一个字符的地址(如果是字符串)。此规则只有一个例外 - char 表(或任何其他表或一般结构)的初始化:char str[]="asasas"; 正在复制实际字符串。
  • 不是字符串文字 - char 数组的初始化会产生巨大的影响
【解决方案2】:

字符串文字由语言定义为末尾有一个空字节。这就是为什么sizeof("POR") 等于4,而不是3。当编译器将字符串文字生成到输出二进制文件中时,它会安排 nul 字节出现。

【讨论】:

    【解决方案3】:

    如果我不得不猜测为什么 C 中的字符串以空值结尾,那可能是因为 Dennis Ritchie 认为能够识别字符串的结尾是个好主意。许多便利功能都使用此功能,例如 strlen

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      • 2021-09-28
      • 2010-09-20
      • 1970-01-01
      • 2012-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多