strcpy函数表现不正常。当Destination的空间小于源字符串时,它正在修改常量字符串。根据标准,如果Destination的空间少于源,则行为是未定义的,但为什么Source(S)被strcpy函数接受为常量?是否会被修改?
#include<string.h>
#include<stdio.h>
int main(){
char S[]="Computer";
char D[]="";
strcpy(D,S);
printf("%s\n",S);
return 0;
}
输出: When size of D(Destination) is equal or more than size of S(source)
输出: When size of D is less than size of S
输出:Omputer [未指定D的大小时]
答案 0 :(得分:1)
尝试理解未定义的行为毫无意义。根据定义,行为是&#34;未定义&#34;。
我的猜测是,堆栈帧中为S
和D
分配的内存如下:
| D | S |
+-- -+---+---+---+---+---+---+---+---+----+
| \0 | C | o | m | p | u | t | e | r | \0 |
+-- -+---+---+---+---+---+---+---+---+----+
当您将D
修改为超出有效限制时,您将结束修改S
的内容。
虽然这对您的平台来说可能是正确的,但不能保证在另一个平台上也是如此。结论:当标准清楚地表明它是未定义的行为时,不依赖于特定的行为。
答案 1 :(得分:0)
事实上,通过选择S&gt; D,你是如此接近创建一个缓冲区溢出。在strcpy(3) man page in my system (FreeBSD 10.2-RELEASE)中,有以下注释
SECURITY CONSIDERATIONS
The strcpy() function is easily misused in a manner which enables mali-
cious users to arbitrarily change a running program's functionality
through a buffer overflow attack.
C不进行任何边界检查,并期望程序员这样做。您可能会或可能不会覆盖其他缓冲区,完全取决于您的编译器实现。
正如评论和其他帖子中所述,您不能指望未定义行为遵循定义的模式。