天天看點

初探C++數組的size可以是變量

  在教材中,關于數組的聲明,格式要求是“類型辨別符 數組名[常量表達式]”,是的數組的大小,數組的size,強調一定是變量。看過不少的書,都在強調一定要用常量,或者用成const定義的常變量,總之,在聲明數組,配置設定存儲空間的時候,size一定是确定的,并且保證以後再不改動。

  在輔導學生時,他編的程式中,聲明數組居然用變量作size,且錯誤不在此處。怎麼可能?可這是事實。

  用下面的簡單示例說明,這種程式在codeblocks中是可以通過編譯的(但在vc++6.0中錯誤):

  回家後查各種書,《c++ primer》還在強調一定是常量表達式,其他書上要麼也這麼說,要麼不強調是常量還是變量。waltersavitch的《c++程式設計(第8版)》中講到“數組長度使用變量,對大多數編譯器是非法的。”在舉例中提到“有的編譯(但并非全部)允許用變量指定數組長度。但是為了移植性,不應該這樣做,即使目前所用的編譯器允許。”

  從網上,有人談到這是從c++99開始增加的新定義。是新的文法特性,多數編譯器根本不支援。

  作為更新很快的codeblocks,支援新标準很正常。

  對于這種新文法,試圖掌握些規律。用下面的一段程式作為調試,考查變量的值發生變化之後,以及再發生記憶體配置設定之後會不會覆寫之類的問題。

  程式運作,總體沒有發現什麼異常,但這并不足以說明程式沒有問題,這樣做不會出問題。而且,codeblocks中對于越界通路也沒有加限制,似乎是件好事,但可能就是壞事。這倒是提醒我們,在利用數組時,更加多幾份小心了。現在政府職能轉變是個熱點話題,權力意味着責任,限制少了,不會老卡在編譯錯誤上,但為了保證程式能夠安全運作,程式設計者應該把關更多。

  還沒有完全搞明白這件事情。但變量作數組聲明中的長度,還是少用。如果要使用動态調整大小的數組,明着來,用動态數組或者c++中提供的array對象,這種影響可移植性的代碼,還是少寫。

  如果以後有閑,倒是可以考察下當初标準為何要做出這樣的調整。調整,意味着有些道理,有機會知道下,還是件不錯的事。

 

繼續閱讀