2012-08-28 34 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字符...這就是爲什麼目標應該有足夠的內存...

相關問題