c - 使用 strncpy 时堆栈和堆的奇怪行为

标签 c string malloc strncpy

我发现了一个很有趣的问题。

当我使用以下代码时:

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/

相关文章:

javascript - 如何在 JavaScript 中有效地将大块分割为许多大小为 2 的小块

c - c中没有堆吗?

c++ - 为什么 C 字 rune 字是 int 而不是 char?

c - 定义 5D 对象并分配内存

c - pic32 跳出引导加载程序导致一般异常

Javascript - 替换字符串文字中的转义字符

c - 外部并行循环中的内部顺序循环 - OMP

c++ - while循环退出后,字符串内容被删除?

C# 字符串换行

c++ - 使用 malloc 和 new - C++