C strcpy() - 邪恶?

标签 c memcpy strcpy

有些人似乎认为 C 的 strcpy() 函数不好或邪恶。虽然我承认通常最好使用 strncpy() 来避免缓冲区溢出,但以下(strdup() 函数的实现对于那些不幸的人来说拥有它)安全地使用 strcpy() 并且应该永远不会溢出:

char *strdup(const char *s1)
{
  char *s2 = malloc(strlen(s1)+1);
  if(s2 == NULL)
  {
    return NULL;
  }
  strcpy(s2, s1);
  return s2;
}

*s2 保证有足够的空间来存储 *s1,使用 strcpy() 使我们不必存储 strlen() 导致另一个函数稍后用作 strncpy() 的不必要(在本例中)长度参数。然而,有些人使用 strncpy() 甚至 memcpy() 编写此函数,它们都需要一个长度参数。我想知道人们对此有何看法。如果您认为 strcpy() 在某些情况下是安全的,请说出来。如果您有充分的理由在这种情况下不使用 strcpy(),请提供 - 我想知道为什么使用 strncpy() 可能更好或 memcpy() 在这种情况下。如果您认为strcpy()可以,但这里不行,请说明。

基本上,我只想知道为什么有些人使用 memcpy() 而其他人使用 strcpy() 而还有一些人使用普通的 strncpy()。有什么逻辑可以优先选择一个而不是三个(忽略前两个的缓冲区检查)?

最佳答案

memcpy 可以比 strcpystrncpy 更快,因为它不必将每个复制的字节与 '\0' 进行比较,并且因为它已经知道复制对象的长度。它可以用类似的方式实现 Duff's device , 或者使用一次复制几个字节的汇编指令,比如 movsw 和 movsd

关于C strcpy() - 邪恶?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/610238/

相关文章:

c- 获取输入后的奇怪行为

c++ - 为什么 std::memcpy 的行为对于不是 TriviallyCopyable 的对象是未定义的?

在 C 中使用 strcpy 和 strcat 的冲突?

c - 错误 : function returns address of local variable

c - 大小为 1 的 Strcpy 读取无效

c - 避免在 C 中读取输入后打印新行

c++ - cv::namedWindow() 在调用时挂起

c - 多线程tcp服务器的并发连接数

c - 是否有 "lseek"要内存?

crash - 当dest为NULL时,memcpy挂起