2

何时需要为NULLC 字符串中的字符显式提供空间。
例如
尽管我没有声明str为 7 个字符长,即字符串加NULL字符的字符,但这没有任何错误。

#include<stdio.h>

int main(){
    char str[6] = "string";
    printf("%s", str);
    return 0;
}

尽管在这个问题https://stackoverflow.com/a/7652089中,用户说
如果您稍后需要修改字符串,这很有用,但要知道它不会超过 40 个字符(或 39 个字符后跟一个空终止符) ,取决于上下文)。

“取决于上下文”是什么意思?

4

5 回答 5

4

何时需要为 C 字符串中的 NULL 字符显式提供空间?

总是。没有那个\0字符会使函数像strcpy,strlen并且通过打印%s行为错误。它可能适用于某些示例(例如您自己的示例),但我不会对此打赌。

另一方面,如果您的字符串是二进制的并且您知道数据包的长度,则您不需要额外的空间。但是你不能使用str*函数。无论如何,这不是你的问题。

于 2013-08-05T09:08:10.843 回答
2

这是错误的,关键字“缓冲区溢出”。内存被覆盖。

char str[4] = "stringulation";
char str2[20];
printf("%s", str);
printf("%s", str2);
于 2013-08-05T09:02:12.453 回答
2

您的代码调用未定义的行为。您可能认为它有效,但代码已损坏。

要存储一个包含 6 个字符和一个空终止符的 C 字符串,您需要一个长度为 7 或更大的字符数组。

何时需要为 C 字符串中的 NULL 字符显式提供空间

没有例外。AC 字符串必须始终包含一个空终止字符。


“取决于上下文”是什么意思?

那里的答案是区分您打算稍后修改的字符串变量或您不会修改的字符串变量。在前一种情况下,您可能会选择为初始内容分配比您需要的更多的内容,因为您希望以后能够添加更多内容。在后一种情况下,您可以简单地为初始值分配尽可能多的字符,仅此而已。

于 2013-08-05T09:04:16.987 回答
2

尝试在您未请求的某个地址上写入可能会导致数据损坏、随机输出或代码的未定义性质。

于 2013-08-05T09:04:49.543 回答
0

0 终止符1是各种库函数(strcpy()strlen()printf()等)识别字符串结尾的方式。当你调用一个函数时

char foo[6] = "hello";
printf( "%s\n", foo );

数组表达式foo在传递给函数之前被转换为指针值,所以函数接收的只是第一个字符的地址;它不知道foo数组有多长。所以它需要一些方法来知道字符串的结尾在哪里。如果foo没有 0 终止符的空间,printf()将继续打印超出数组末尾的字符,直到它看到一个 0 值字节。


1. 我更喜欢使用术语“0 终止符”而不是“NULL 终止符”,只是为了避免与 NULL 指针混淆,这是另一回事。

于 2013-08-05T11:47:16.857 回答