c - calloc char 数组与 null 终止符之间的关系

标签 c calloc strncpy nul

网络上关于 strncpy 安全与不安全的整个“辩论”让我发疯。我发现有些人说 strncpy 是“魔鬼”,在我看来,这听起来像是他们缺乏编程纪律。我发现当 src 大于 dest 时,没有将 \0 字符添加到 dest 的末尾>(这最终会导致问题)。我听说过 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 相同是否错误?

最佳答案

将数组清空为0会将所有字符填充到\0

So '\0' is completely equivalent to an unadorned 0 integer constant - the only difference is in the intent that it conveys to a human reader ("I'm using this as a null character.").

参见What is the difference between NULL, '\0' and 0

关于c - calloc char 数组与 null 终止符之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51053061/

相关文章:

您能否举例说明我列出的有关 c11 标准的 calloc 的提示,以帮助我理解它们?

c - 在 C 中释放一棵树

c - 为什么我不能在 C 中使用函数参数作为数组大小?

c - srand 函数是否适用于多个翻译单元?

c - 在 linux 中测量 c 程序的运行时间

c - 在串行通信的情况下,tcgetattr 的错误 9 是什么

c - 未初始化的值是由堆分配创建的

c - 使用 C 查找 JPG/JPEG 图像的高度和宽度

c - 如何将 "MyDef ** t"malloc 到特定长度,而不是 C 中的 "MyDef * t[5]"

python - 将零填充字节转换为 UTF-8 字符串