C中的字符串,Strcpy行为怪异[重复]

yzckvree  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(85)

此问题已在此处有答案

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 侠”。

olhwl3o2

olhwl3o21#

strcpy之前:

name2 [ ] [ ] [ ] [ ] [ ]
name  [T] [h] [e] [ ] [B] [a] [t] [m] [a] [n] [\0]

strcpy之后:

name2 [T] [h] [e] [ ] [B]
name  [a] [t] [m] [a] [n] [\0] [t] [m] [a] [n] [\0]

即,strcpyname2分配的存储器溢出到name的开始,在开始处重写内容。
当然,当您打印name时,打印将停止在\0,并且只显示“atman”。
当你打印name2时,它将超过你分配的5个字符,并溢出到name内存中,并显示(你认为正确的)"The Batman",但是,它已经表明有些东西是错误的,因为你可以看到一个存储在那里的字符串比你分配的内存大。
你很幸运你的程序没有崩溃。
您提供的代码实际上是不可预测的行为,因为不能保证编译器会像上面描述的那样组织namename2。事实上,如果name2是最后组织的,那么strcpy可能会违反所有其他变量和/或代码。
现在,C strcpy被认为是非常不安全的。现代编译器警告您不要直接调用它。他们会强迫你使用strncpy

相关问题