为什么strcpy会触发错误?
如果没有使用strcpy为什么strcpy会触发错误?,c,C,如果没有使用strcpystrcpy复制字符串,则该程序工作正常,但我想知道原因是什么 #include <stdio.h> #include <string.h> int main () { int mat; char test1[20]={"Hex"} ; char test2[20]={"agonal"} ; strcpy(test1,"Diagonal"); // the print outputs the concatena
strcpy
复制字符串,则该程序工作正常,但我想知道原因是什么
#include <stdio.h>
#include <string.h>
int main ()
{
int mat;
char test1[20]={"Hex"} ;
char test2[20]={"agonal"} ;
strcpy(test1,"Diagonal"); // the print outputs the concatenated test if strcpy is commented out
//printf("a=%c\nb=%c\n",test1[0],test1[1]);
printf("Concatenated test=%s", strcat(test1, test2));
return 0;
}
ERROR MESSAGE
*** buffer overflow detected ***: ./prog terminated
======= Backtrace: =========
/lib/libc.so.6(__fortify_fail+0x48)[0xb75b6ae8]
/lib/libc.so.6[0xb75b4b30]
/lib/libc.so.6[0xb75b3dcd]
./prog(__gxx_personality_v0+0x14d)[0x804858d]
./prog(__gxx_personality_v0+0x31)[0x8048471]
======= Memory map: ========
#包括
#包括
int main()
{
int mat;
char test1[20]={“Hex”};
char test2[20]={“agonal”};
strcpy(test1,“对角线”);//如果strcpy被注释掉,则打印输出连接的测试
//printf(“a=%c\nb=%c\n”,test1[0],test1[1]);
printf(“连接测试=%s”,strcat(test1,test2));
返回0;
}
错误消息
***检测到缓冲区溢出***:./prog已终止
=========回溯:=========
/lib/libc.so.6(\uu加强\u失败+0x48)[0xb75b6ae8]
/lib/libc.so.6[0xb75b4b30]
/lib/libc.so.6[0xb75b3dcd]
./程序(uuugxx_uv0+0x14d)[0x804858d]
./程序(uuugxx_uv0+0x31)[0x8048471]
=======内存映射:========
strcat调用失败。在test1
中没有足够的空间来存储“对角线”
和“对角线”
的串联
如果将test1
设置得足够大,它应该可以工作:
char test1[40]={"Hex"} ;
strcat
调用溢出目标缓冲区
另外,您刚刚将test1的大小增加到20,现在它应该可以工作了。离开这个strcpy将导致您将十六进制与对角线连接起来,并尝试将其存储在10个元素的数组中。
六边形对角线的长度是…记住一件事。。。。使用strcpy时。。。然后用空字符将源复制到目标。。。这就是为什么destination应该有足够的内存…“对角线”+“对角线”大于10这就是为什么更喜欢指定最大大小的函数,如strncat
和strncpy
,这是一个好主意。看起来,上述问题中的错误已得到纠正(数组大小从10更改为20)。这意味着下面的所有答案现在似乎都没有任何意义。在阅读了Pablos的答案和编辑后,我觉得自己很愚蠢:)@user1630275:现在没有人会理解你的问题你的答案说明了一切:)我至少要有15个代表才能投票!宝贝工作的糖果!仅标题就暴露了字符串空间分配问题。不过,你还是第一个,所以我还要补充一点。。