C中的空终止字符串

Art*_*ans 6 c string null

我很担心 C 中的字符串。我需要设置最后一个字符 \0 还是它自己设置?如果我不手动执行,那么当我尝试调试代码以及​​访问 string1[257] 时它不为空。我在释放字符串数组的分配内存时遇到问题,所以我认为这是一个原因。

char string1[257], string2[257];
scanf("%s", &string2);
string1[257] = '\0';
strncpy(string1, string2, 257);
string1[257] = '\0'; /* do I need to do that? */
Run Code Online (Sandbox Code Playgroud)

Mic*_*ice 11

字符串文字"Hello World!"以 null 结尾,但char数组不会自动以 null 结尾。

我一直采取的一般原则是要格外小心,并分配'\0'给字符串的末尾,除非这会导致性能问题。在这些情况下,我会格外小心我使用的库函数。

  • 那是“\0”(NUL),而不是“NULL”。 (6认同)
  • 然而 NULL、0 和 '\0' 具有不同的含义。无需仅仅因为 30 年前设计的语言允许您将它们混为一谈。 (6认同)
  • 不一定,`NULL`可以定义为[`((void*)0)`](http://c-faq.com/null/macro.html)。无论如何,这些是不同的概念,不应混为一谈。 (4认同)

Jos*_*phH 1

绝对有必要吗?,因为当您调用scanf, strcpy(除非strncpy超出大小时需要手动输入零),它会为您复制空终止符。无论如何这样做好吗?事实并非如此,它并不能真正解决缓冲区溢出问题,因为这些函数无论如何都会超出缓冲区的大小。那么最好的办法是什么?将 C++ 与std::string.

顺便说一句,如果您访问/写入string1[257],这将超出范围,因为您正在访问/写入大小为 257 的数组中的第 258 个元素。(它是基于 0 的索引)