什么时候printf(“%s”,char *)停止打印?

时间:2010-04-28 01:32:33

标签: c printf

在我的课上,我们正在编写自己的C的malloc()函数副本。为了测试我的代码(当前可以分配空间很好)我正在使用:

char* ptr = my_malloc(6*sizeof(char));
memcpy(ptr, "Hello\n", 6*sizeof(char));
printf("%s", ptr);

输出通常是这样的:

Hello
Unprintable character

有些调试认为我的代码本身并没有造成这种情况,因为ptr的内存如下:

[24个字节的元信息] [请求的字节数] [填充]

所以我认为printf正在进入padding,这只是垃圾。所以我测试了: printf("%s", "test\nd");得到了:

test
d

这让我很奇怪,当DOES printf(“%s”,char *)停止打印字符时?

4 个答案:

答案 0 :(得分:28)

当它到达空字符(\0)时停止打印,因为%s期望字符串为空终止(即,它期望参数为C字符串)。

字符串文字"test\nd"以null结尾(所有字符串文字都以null结尾)。但是,您的字符数组ptr不是因为您只将六个字符复制到缓冲区(Hello\n)中,而您不复制第七个字符 - 空终止符。

答案 1 :(得分:5)

James对于printf在获取空字符时停止是正确的,并且Uri是正确的,你需要分配一个7字符的缓冲区来保存“hello \ n”。

如果您使用通常的C语言复制字符串strcpy(ptr, "Hello\n")而不是memcpy,则可以减轻对终结符的一些混淆。

另外,根据定义,sizeof(char)== 1 in C,所以6*sizeof(char)是多余的

答案 2 :(得分:3)

C字符串以空值终止(末尾有一个\ 0字符),这就是C知道何时停止打印或将缓冲区作为字符串处理的方式。您有责任永远不要将字符串放在比您分配的更长的空间中。

请注意,Hello \ n不是六个字符的字符串,实际上是七个字符的字符串。 你使用五个用于Hello,一个用于换行,一个用于null终止符。

尝试将7个字符放入六个字符的缓冲区被认为是一个错误,我不确定它是否对您当前遇到的问题负责,但似乎复制6个字符不会复制空终止符。所以我实际上希望你的印刷品超越Hello,进入一些实际的垃圾。

答案 3 :(得分:0)

达到零时。你需要7个字符。

相关问题