2013-03-17 41 views
2

在編寫下面的代碼時,我應該得到一個錯誤。數組的大小爲零(我認爲這是非法的),而且sprintf正在打印「abc」給一個沒有分配任何內存但我得到的輸出爲「abc」。我不明白爲什麼?動態內存分配和sprintf

#include<stdio.h> 
#include<string.h> 
int main() 
    { 
    char a[0]; 
    sprintf(a,"%s","abc"); 
    printf("%s\n",a); 
    return 0; 
    } 

我正在當我給數組的大小爲1,2,3,同時它給分段錯誤顯式使用作爲指針,即,不應該是的情況下正確的輸出,利用char * a(這是預期的)。有人可以解釋內部工作嗎?

+0

它可能是有幫助的 - 當運行'sprintf(char * string)時可能會有幫助 - http://stackoverflow.com/questions/14565778/c-how-protect-dynamic-char-before-overwritte-by-second-dynamic-char – 2013-03-17 13:25:03

+0

,const char *,...)指向'string'結尾的指針總是被定義爲'(char *) - 1',或者使用'vsnprintf(buf,SIZE_MAX,format,arg);'顯然,它們不安全。 – yuan 2013-03-17 15:52:00

+0

你很可能會覆蓋堆棧中分配的內存,這就是爲什麼你沒有段錯誤。如果它覆蓋了不需要的數據,那麼看起來一切正常。 – teppic 2013-03-17 17:23:25

回答

4

不,沒有合理的解釋。通過使用小於要打印的字符串的數組,程序會調用未定義的行爲。這意味着,字面上什麼都可以發生,包括事實似乎一切正常。未定義的行爲並不意味着程序必須崩潰,這意味着它可以可以崩潰。