【发布时间】:2018-06-27 00:42:22
【问题描述】:
网络上关于strncpy 是安全还是不安全的整个“辩论”让我发疯。我发现有些人说strncpy 是“魔鬼”,在我看来他们缺乏编程纪律。我知道当src 大于dest 时,dest 末尾没有添加\0 字符(这最终会导致问题)。我听说过strlcpy,但据我所知,这不是标准的。我希望我的代码尽可能可移植,所以我不认为这是一个可行的解决方案。
这是我目前的解决方案...
先定义缓冲区大小
#define BUFSIZE 1024
在程序中,使用calloc分配缓冲区
char *buffer;
buffer = calloc(BUFSIZE+1, sizeof(char));
然后在代码的后面,假设我想将 msg 复制到 buffer 并使用
strncpy(buffer,msg,BUFSIZE);
由于我用BUFSIZE + 1 预先分配了buffer,因此这确保buffer 的最后一个字节是\0,无论msg 是否大于BUFSIZE。
现在的问题是,calloc 是否用\0 初始化字符数组?把calloc的零分配解释为和\0一样是不是错了?
【问题讨论】:
-
来自cplusplus.com/reference/cstdlib/calloc:“分配和零初始化数组”。
\0只是表示“整数0代表的字符”。 -
在这种情况下,
calloc没有用,因为您完全更改字符串的值只需使用malloc。 -
我相信我只是在更改字符串的第一个
BUFSIZE元素。calloc(带有BUFSIZE+1)的目的是确保最后一个元素是0,我在解决方案中收集到的元素等于\0。这意味着字符串将始终具有 nul 终止字符。malloc没有用零初始化数组,因此我没有使用它。 -
或者您可以使用
malloc并分配唯一重要的\0。 -
是的,我想我可以做到。