我在哪里可以假设在C中自动添加空字符?

Gee*_*_SO 0 c string null

我知道这两个实例会自动添加null终止符:

char test[100] = "Null terminator will follow me";
Run Code Online (Sandbox Code Playgroud)

/*...String already initialised*/
sprintf(test,"Null terminator will follow me");
Run Code Online (Sandbox Code Playgroud)

但是在常规C使用中会发生什么呢?

Kei*_*son 7

首先,NULL是一个扩展为空指针常量的宏; 使用该术语来引用空字符最多会导致混淆,最坏的情况是错误的代码.

C字符串由空字符终止'\0',有时称为"NUL".这是C标准对"字符串"一词的定义的一部分:

是由封端的字符的连续序列,并且包括第一个空字符.

几乎所有的字符串文字(由"字符分隔)都隐含地包含一个空终止符 - 即使它还有一个明确的终结符.例如:

 "abc\0def"
Run Code Online (Sandbox Code Playgroud)

是指包含以下内容的数组:

 { 'a', 'b', 'c', '\0', 'd', 'e', 'f', '\0' }
Run Code Online (Sandbox Code Playgroud)

一个例外是当字符串文字用作与文字长度完全相同的数组的初始值设定项时:

 char nonterminated[5] = "12345";
Run Code Online (Sandbox Code Playgroud)

(C++没有这种特殊情况,并使上述声明非法.)

如果正确使用它们,str*()声明的大多数函数<string.h>都会为您提供正确的以null结尾的字符串.(该功能是一个值得注意的例外 ;我建议避免它.)strncpy()

任何文档说它处理"字符串"的函数都要求或产生一个正确的以null结尾的字符串(假设函数及其文档都是正确的).

  • @ Spellbinder2050:“对象”一词以多种方式使用。C 标准将其定义为“执行环境中的数据存储区域,其内容可以表示值”(基本上是一个变量)。标头不会为“NULL”分配任何存储空间;它是一个宏,这意味着程序中对“NULL”的任何引用都会在编译时扩展为适当的标记序列,就像你写的是“0”或“((void*)0)”而不是“NULL” `. 这是否会导致任何东西被分配取决于你用它做什么。 (2认同)