【问题标题】:Relation between calloc char array and null terminating charactercalloc char数组与空终止字符之间的关系
【发布时间】: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
  • 是的,我想我可以做到。

标签: c calloc strncpy nul


【解决方案1】:

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

所以 '\0' 完全等同于一个朴素的 0 整数常量 - 唯一的区别在于它传达给人类读者的意图(“我将其用作空字符。”)。

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

【讨论】:

    猜你喜欢
    • 2012-04-20
    • 1970-01-01
    • 1970-01-01
    • 2012-10-07
    • 2012-08-14
    • 2012-03-06
    • 2012-10-27
    • 1970-01-01
    • 2014-04-08
    相关资源
    最近更新 更多