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(這是預期的)。有人可以解釋內部工作嗎?
它可能是有幫助的 - 當運行'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
,const char *,...)指向'string'結尾的指針總是被定義爲'(char *) - 1',或者使用'vsnprintf(buf,SIZE_MAX,format,arg);'顯然,它們不安全。 – yuan 2013-03-17 15:52:00
你很可能會覆蓋堆棧中分配的內存,這就是爲什麼你沒有段錯誤。如果它覆蓋了不需要的數據,那麼看起來一切正常。 – teppic 2013-03-17 17:23:25