今天同學在群裡火急火燎的@我還以為有什麼事要發生呢,結果發了一段代碼出來,大概是這個意思:
1 #include <stdio.h> 2 int main() 3 { 4 int n; 5 scanf("%d", &n); 6 int data[n]; 7 return 0; 8 }
第一反應是這代碼是哪個傻逼新生寫得呢!結果,他說這個代碼GCC編譯通過了,當然我也試了一下,VS不用編譯就有紅色的下劃線了,Dev C++用GCC編譯確實是通過了,等等,我想靜靜,那麼問題來了,靜靜是誰?難道是GCC編譯器有bug?上C語言課老師可是反復強調C/C++沒有變長數組啊(除非new一個),可GCC編譯器是經過這麼多人測試全球都在使用的東西啊,這作何解釋呢?
結論是編譯器智能了。它懂你的意思。就不要那麼古板了,它為什麼可以這麼做呢?這樣不是違反了C標准嗎?要從C標准說的話就有話說啦,C標准規定了不能有變長數組,但是C標准為了程序運行效率沒有做越界處理,是否越界全靠程序員決定,而這一點正好給了編譯器發揮的余地,每一個進程開始運行的時候操作系統總會分一個棧給它,編譯器便是利用這個棧來實現這個“變長數組”的,至於個中細節,還需推敲。
幾乎每一個編譯器對這種C標准比較模糊的概念都有自己的解釋。