gpt4 book ai didi

C - strcpy 的一般使用

转载 作者:行者123 更新时间:2023-11-30 17:16:12 24 4
gpt4 key购买 nike

我有这段代码:

new->name = zalloc(sizeof(char) * strlen(name) + 1);
if (!new->name)
goto alloc_failed;
strcpy(new->name, name);

如果 strcpy() 不赞成,那么即使预先分配了 namespace ,也是一般用途。只是为了安全目的而想知道。最好使用 strncpy() 或 srtlcpy()。

最佳答案

您的编码示例有一些小问题:

new->name = zalloc(sizeof(char) * strlen(name) + 1);
if (!new->name)
goto alloc_failed;
strcpy(new->name, name);

分配的大小计算为 sizeof(char) * strlen(name) + 1 。如果你坚持乘以sizeof(char)根据定义等于 1 ,你至少应该写:sizeof(char) * (strlen(name) + 1) 。除此之外,您对 strcpy 的使用在此示例中很好,但将大小存储在局部变量中并使用 memcpy 会更有效。 :

{
size_t size = strlen(name) + 1;
new->name = zalloc(size);
if (!new->name)
goto alloc_failed;
memcpy(new->name, name, size);
}

另请注意,POSIX 系统有 strdup()使用 malloc 做同样的事情。如果zalloc()malloc() 上的薄 wrapper 从单个大小参数分配内存并将其初始化为零,您可以使用 strdup()作为此代码的简单替换。如果是自定义内存分配方案,还应该提供zstrdup()因为重复字符串在许多 C 程序中很常见。

关于风格的另一个小评论:使用goto如果本地编码约定允许的话,这里没问题,但最好不要使用明显的 C++ 关键字,例如 newdelete作为普通标识符。

关于strlcpy() ,它可能在您的平台上可用,也可能不可用,但对于其他地方来说是一个不错的选择。 strncpy()最好避免 OTOH。它是一个标准 C 函数,但其​​语义与 C 库的其余部分不一致,因此经常被误用:

  • 著名的缺点是 strncpy()不钉'\0'如果源字符串长于大小参数,则在目标末尾。 snprintf(dest, size, "%s", src);会这样做,但可能不是很有效。

  • strncpy 的鲜为人知的副作用当源字符串短于大小参数时发生:目标数组'\0' 填充 一直到最后。使用strncpy()如果目标数组比源数组长得多,则避免缓冲区溢出的效率非常低。

关于C - strcpy 的一般使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29738198/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com