为什么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
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个代表才能投票!宝贝工作的糖果!仅标题就暴露了字符串空间分配问题。不过,你还是第一个,所以我还要补充一点。。