- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
有些人似乎认为 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
可以比 strcpy
和 strncpy
更快,因为它不必将每个复制的字节与 '\0' 进行比较,并且因为它已经知道复制对象的长度。它可以用类似的方式实现 Duff's device , 或者使用一次复制几个字节的汇编指令,比如 movsw 和 movsd
关于C strcpy() - 邪恶?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/610238/
对于线程和计时器之类的东西,我无法忍受拖放控件。这些控件只是感觉与它们存在的实际本质相去甚远。拖放一个线程?我希望拖拽者在他们这样做之前了解幕后发生的事情。 这些抽象是否离金属太远了?他们是在帮助还是
有些人似乎认为 C 的 strcpy() 函数不好或邪恶。虽然我承认通常最好使用 strncpy() 来避免缓冲区溢出,但以下(strdup() 函数的实现对于那些不幸的人来说拥有它)安全地使用 st
我一直在用 matrix = *((fxMatrix*)&d3dMatrix); 好久不见。它工作正常,直到我的屏幕变黑并在我的办公 table 上收到一桶挫败感。 fxMatrix 包含 4 个 f
这是我应该问的问题,而不是这个: Emacs evil: space as a prefix key in motion state 我想定义一堆用于移动、移动、打开和关闭窗口和缓冲区的命令,这些命令
作为 Vim 用户,我在将近二十年后尝试 Emacs+Evil。我正在将我的大部分 Vim 配置移至 Evil,但我遇到很多问题的一件事是像我在 Vim 中使用的那样设置搜索和突出显示。我想要得到的是
很难说出这里问的是什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或言辞激烈,无法以目前的形式合理回答。如需帮助澄清此问题以便可以重新打开,visit the help center . 9年前关闭
我是一名优秀的程序员,十分优秀!