繁体   English   中英

strncpy() 是 memcpy() 的特化吗?

[英]Is strncpy() a specialization of memcpy()?

只是想知道(因为我们经常使用这些功能)。 我看不出strncpy()memcpy()之间有任何实际区别。 不值得这么有效地说,

char* strncpy (char *dst, const char *src, size_t size)
{
  return (char*)memcpy(dst, src, size);
}

还是我错过了任何副作用? 之前有一个类似的问题,但找不到确切的答案。

有区别,请参阅您链接到的strncpy页面的这一部分(强调我的):

将源的前 num 个字符复制到目标。 如果在复制 num 个字符之前找到源 C 字符串的结尾(由空字符表示),则用零填充目标,直到总共写入了 num 个字符。

因此,如果要复制的字符串短于限制,则strncpy用零填充,而memcpy读取超出限制(可能调用未定义的行为)。

不,它们不一样。

来自 C 标准 (ISO/IEC 9899:1999 (E))

7.21.2.3 strcpy function

描述

2 strncpy function 从 s2 指向的数组复制不超过 n 个字符(不复制 null 字符之后的字符)到 s1.260 指向的数组) 如果复制发生在重叠的对象之间,则行为是不明确的。
3 如果 s2 指向的数组是一个短于 n 个字符的字符串,则 null 字符将附加到 s1 指向的数组的副本中,直到 n 个字符全部写入。
退货
4 strncpy function 返回 s1 的值。

7.21.2.1 memcpy function
描述

2 memcpy function 将 n 个字符从 s2 指向的 object 复制到 s1 指向的 object 中。 如果复制发生在重叠的对象之间,则行为未定义。
返回 3 memcpy function 返回 s1 的值。

使用memcpy()时,源缓冲区和目标缓冲区可以重叠,而在strncpy()中则不能发生这种情况。

根据 C 标准,对于strncpy()memcpy() ,重叠缓冲区的行为都未定义。

根据 C 标准, strncpy()memcpy()之间的真正区别在于,如果源字符串小于 N 值,则将 NULL 字符附加到剩余的 N 数量。

memcpy()效率更高,但安全性较低,因为它不检查源以查看是否有 N 个数量可以移动到目标缓冲区。

不, strncpy()不是专门化的,因为它会在复制过程中检测到'\0'字符并停止,而memcpy()不会这样做。

加上其他人所说的, src 和 dst 指针的类型并不重要。 也就是说,我可以将 4 字节 integer 复制到 1 字节的 4 个连续字符,如下所示:

int num = 5;
char arr[4];
memcpy(arr, &num, 4);

另一个区别是 memcpy 看起来没有任何字符(例如 NULL,由 strncpy 提供)。 它盲目地将 num 个字节从源复制到目标。

编辑:正确格式化代码

您可以通过检查 \0 并且不复制该点来使 strncpy 更快。 所以 memcpy 总是会复制所有数据,但 strncpy 通常会因为检查而更快。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM