这里有一个代码,它分配一些内存并将字符串复制到其中
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(){
char *t ="your_char";
char *s = (char*)malloc(9);
memcpy(s,t,9);
printf("%sn",t);
printf("%s",s);
return 0;
}
现在的输出是
your_char
your_char☺╚
而这正是我无法理解的。如果我更改为memcpy(s,t,10)
,那么末尾就没有垃圾值。
我认为这是因为在第二种情况下也会复制null终止符但是,当我只分配了9个字节,而它们已经被我复制的字符占用时,为什么会有一个空的地方。
字符串是以null结尾的字符数组("null字符"是指数值为0的字符(。null字符标记字符串的末尾,如果数组中没有null字符,则它不是字符串。特别是,不能用%s
说明符printf
它,因为printf
不知道它在哪里结束。
字符串文字总是自动有一个字符,例如,"your_char"
中有十个字符,而不是九个。如果动态分配字符串,则应始终考虑额外的字符。