此问题已在此处有答案:
Explanation of C buffer overflow(3个答案)
How dangerous is it to access an array out of bounds?(12个答案)
Undefined, unspecified and implementation-defined behavior(9个回答)
上个月关门了。
strcpy函数工作得很奇怪,我想知道发生了什么。
char name[] = "The Batman"; //10 characters
char name2[5];
strcpy(name2, name);
由于某种原因,名字已经改变了。它现在是“阿特曼”。为什么这里的名字变了?name2被成功分配给“ bat 侠”。怎么可能呢,因为name2不够大,装不下“ bat 侠”。
1条答案
按热度按时间olhwl3o21#
strcpy
之前:strcpy
之后:即,
strcpy
将name2
分配的存储器溢出到name
的开始,在开始处重写内容。当然,当您打印
name
时,打印将停止在\0
,并且只显示“atman”。当你打印
name2
时,它将超过你分配的5个字符,并溢出到name
内存中,并显示(你认为正确的)"The Batman"
,但是,它已经表明有些东西是错误的,因为你可以看到一个存储在那里的字符串比你分配的内存大。你很幸运你的程序没有崩溃。
您提供的代码实际上是不可预测的行为,因为不能保证编译器会像上面描述的那样组织
name
和name2
。事实上,如果name2
是最后组织的,那么strcpy
可能会违反所有其他变量和/或代码。现在,C
strcpy
被认为是非常不安全的。现代编译器警告您不要直接调用它。他们会强迫你使用strncpy
。