只是好奇地知道(因为我们经常使用这些功能)。我认为strncpy()和memcpy()之间没有任何实际差异。有效地说,不值得,
char* strncpy (char *dst, const char *src, size_t size)
{
return (char*)memcpy(dst, src, size);
}
或者我错过任何副作用?有一个类似的earlier question,但找不到确切的答案。
答案 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通常会更快。