为什么strcpy会触发错误?

时间:2012-08-28 12:45:37

标签: c

如果不使用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: ========

4 个答案:

答案 0 :(得分:10)

strcat来电是失败的。 test1中没有足够的空间来存储"Diagonal""agonal"的串联。

如果你使test1足够大,它应该可以工作:

char test1[40]={"Hex"} ;

答案 1 :(得分:2)

strcat调用溢出目标缓冲区。

P.S。您刚刚将test1大小增加到20,现在应该可以正常工作。

答案 2 :(得分:0)

离开此strcpy将导致您将 Hex Diagonal 连接并尝试将其存储在10个元素数组中。 HexDiagonal 的长度为......

答案 3 :(得分:0)

还记得一件事.......当使用strcpy时...然后将复制到目的地并使用NULL CHARACTER ...这就是为什么目的地应该有足够的记忆......