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

时间:2011-06-28 16:01:43

标签: c++ c standard-library

只是好奇地知道(因为我们经常使用这些功能)。我认为strncpy()memcpy()之间没有任何实际差异。有效地说,不值得,

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

或者我错过任何副作用?有一个类似的earlier question,但找不到确切的答案。

5 个答案:

答案 0 :(得分:8)

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

  

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

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

答案 1 :(得分:3)

不,他们不一样。

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

7.21.2.3 strcpy函数

说明

  

2 strncpy函数复制不超过n个字符(跟随null的字符)   字符未被复制)从s2指向的数组到s1.260指向的数组)如果在重叠的对象之间进行复制,则行为未定义。
  3如果s2指向的数组是一个短于n个字符的字符串,则空字符将附加到s1指向的数组中的副本,直到写入所有n个字符为止。
  返回
  4 strncpy函数返回s1的值。

7.21.2.1 memcpy功能
说明

  

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

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

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

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

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

答案 2 :(得分:1)

不,strncpy()不是专业化,因为它会在复制和停止期间检测到'\0'个字符,而memcpy()则不会。{/ p>

答案 3 :(得分:1)

添加其他人所说的内容,src和dst指针的类型无关紧要。也就是说,我可以将4字节整数复制到1个字节的4个连续字符,如下所示:

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

另一个区别是memcpy看起来不是任何字符(例如NULL,strncpy)。它盲目地从源到目的地复制num个字节。

编辑:正确格式化代码

答案 4 :(得分:0)

通过检查\ 0而不是复制超过该点,您可以更快地加快strncpy。所以memcpy总是会复制所有数据,但是由于检查,strncpy通常会更快。