2012-08-28 36 views
2

如果字符串不是使用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: ======== 
+0

“Diagonal”+“agonal”大于10 –

+0

这就是为什么喜欢'strncat'和'strncpy'这些指定最大大小的函数是个好主意。 – aschepler

+0

看来,错误在上面的问题**中得到了纠正(数组大小从10变为20)。这意味着现在所有的答案似乎都没有任何意义。 – wildplasser

回答

10

strcat呼叫是一个失败。 test1中没有足够的空间来存储"Diagonal""agonal"的并置。

如果您test1足够大,它应该工作:

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

Yay Pablo!容易upvotes;) – Borrito

+1

从宝贝工作的糖果!只是标题给了一个字符串空间分配问题。但是,你是第一个,所以我会再补充一点.. –

2

strcat呼叫溢出目标缓冲区。

P.S.你刚刚将test1大小增加到了20,现在它应该可以工作。

+0

我觉得很蠢,刚读完Pablos回答,因此编辑:) – Borrito

+1

@ user1630275:现在没有人会理解你的问题 – Andrey

+1

你的回答说这一切:)我不能upvote,直到我有至少15代表! – Borrito

0

离开这个的strcpy将带领您串联六角对角线并试图将其店内10个元素的数组。 和长度HexDiagonal的是...

0

记住一件事....当使用strcpy的...然后在SOURSE复制到目的地用NULL字符...这就是为什么目标应该有足够的内存...

相关问题