我发现了一个很有趣的问题。
当我使用以下代码时:
int main() {
char * in = "hi, ";
char str[10];
strncpy(str, in, 2);
printf("output = %s", str);
return 0;
}
我的结果是什么,printf
没有工作。
但是如果我使用这个:
int main() {
char * in = "hi, ";
char * str = malloc(sizeof(char) * 10) ;
strncpy(str, in, 2);
printf("output = %s", str);
return 0;
}
我能得到我所期望的。
为什么会这样?是因为栈和堆吗?这究竟是如何造成这种巨大差异的?
最佳答案
问题 - 在两种 情况下 - 是您的字符串在调用 strncpy
后无法正确终止。
您指定复制 2
个字符,并且您的源字符串 in
的长度为 4。因此 strncpy
将复制 2 个字符,因为它小于源字符串的长度,所以不会添加空终止符 - 要了解为什么会这样,请查看 docs for strncpy :
如果在复制整个字符串 src 之前达到计数,则生成的字符数组不是以 null 结尾的。
在这种情况下,您需要:
str[2] = '\0';
在“strncpy”之后。
第二种情况可能似乎可行,因为您从 malloc
获得的缓冲区恰好被初始化为全零,但您不应该靠这个。
请查看 docs for strncpy ,注意空终止的异常,一般来说,要小心字符串终止!
有关更多详细信息,请参阅:Why are strings in C++ usually terminated with '\0'?
关于c - 使用 strncpy 时堆栈和堆的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10987327/