2012-10-07 81 views
-1
void xstrcpy (char *t, char *s); 

void main(void) {  
    char source[ ] = "Sayonara" ; 
    char target[20] ; 
    xstrcpy (target, source) ; 
    printf ("\nsource string = %s", source); 
    printf ("\ntarget string = %s", target) ; 
} 

void xstrcpy (char *t, char *s) { 
    while (*s != '\0'){ 
     *t = *s ;  
     t++ ; s++ ; 
    } 
    *t = '\0' ; 
} 

這個代碼給出輸出:這是爲什麼發生在c?

source string = Sayonara 
target string = Sayonara 

但是,當我改變char target[20];char target[8];,它提供了:

source string = target string = Sayonara 

當我改變char target[20];char target[4];,它提供了:

source string = nara 
target string = Sayonara 

當我改變char target[20];char target[3];,它給出:

source string = nara 
target string = Sayonara 

爲什麼源值變化,和目標變爲具有串的尺寸數組?

+2

我可以縮進這段代碼嗎? – Jack

+2

任何託管環境都需要來自'main'的整型返回值。 – chris

+0

請格式化您的代碼。這是一個混亂的時刻,沒有人會想要篩選。 –

回答

5

當您的目標短於要求時,它會覆蓋它後面的任何數據。特別是,當你製作它8時,它會覆蓋終止零的源的開始。當你製作它4時,它會用源字符串的尾部覆蓋源。

這就是發生了什麼事。雖然這種行爲不能保證,當然,未定義。

+0

謝謝邁克爾,我明白了。當我把目標和源數組聲明之間的另一個字符數組,源數組完美打印。 – HardikHarpal

+0

是的,但通常應該防止訪問超出分配大小的數組元素。你無法可靠地分辨陣列末尾發生了什麼。 –

1

由於目標是在堆棧上分配的,因此當您將溢出數據複製到此陣列時,它將覆蓋之後的代碼。不要這樣做,這是不確定的行爲。

+3

在堆的末尾寫入仍然是未定義的行爲。 – chris

+1

後面跟着「CODE」? –

0

沒有數組綁定檢查,如果發生數據溢出行爲未定義!

相關問題