何时需要在C字符串中明确地为NULL
字符提供空间
例如;
虽然我没有声明str
长度为7个字符,即字符串加上NULL
字符的字符,但这没有任何错误。
#include<stdio.h>
int main(){
char str[6] = "string";
printf("%s", str);
return 0;
}
虽然在这个问题中https://stackoverflow.com/a/7652089用户说了 “如果您稍后需要修改字符串,但是知道它不会超过40个字符(或者39个字符后跟空终止符,具体取决于上下文),这非常有用。”
“取决于上下文”是什么意思?
答案 0 :(得分:4)
何时需要在C字符串中为NULL字符显式提供空间?
始终即可。没有\0
字符会使strcpy
,strlen
和%s
打印等功能出错。它可能适用于某些例子(比如你自己的),但我不打赌任何事情。
另一方面,如果您的字符串是二进制文件,并且您知道数据包的长度,则不需要额外的空间。但是你不能使用str*
函数。无论如何,这不是你的问题。
答案 1 :(得分:2)
您的代码调用未定义的行为。您可能认为它有效,但代码已被破坏。
要存储包含6个字符的C字符串和空终止符,您需要一个长度为7或更长的字符数组。
何时需要为C字符串中的NULL字符显式提供空间
没有例外。 C字符串必须始终包含空终止字符。
“取决于具体情况”是什么意思?
答案是描绘您打算稍后修改的字符串变量或您不会修改的字符串变量之间的区别。在前一种情况下,您可以选择为初始内容分配超过您需要的内容,因为您希望以后能够添加更多内容。在后一种情况下,您可以简单地为初始值分配所需的字符数,而不再需要。
答案 2 :(得分:2)
尝试写入您未请求的某个地址可能会导致数据损坏,随机输出或未定义的代码性质。
答案 3 :(得分:1)
这是错误的,关键字“缓冲区溢出”。记忆被覆盖。
char str[4] = "stringulation";
char str2[20];
printf("%s", str);
printf("%s", str2);
答案 4 :(得分:0)