2013-02-17 72 views
0

在C(用gcc),我曾經有同着一些額外信息的數組一些數據結構:運行時大小的數組

struct song { 
    uint tempo; 
    uint key; 
    note play[0]; // or play[] depending on compiler flavour 
}; 

IIRC,這是被稱爲「柔性陣列「(http://gcc.gnu.org/onlinedocs/gcc/Zero-Length.html#Zero-Length) 然後,我可以在運行時爲malloc(sizeof(song)+N*sizeof(note))分配一首N個音符的歌曲。 如果我不打算在這個時候使用向量,在g ++中支持的程度如何,也不要在song中引入無用的note*指針?

+0

」也不會在歌曲中引入無用的音符*指針「 - 您逗我了。順便說一句'malloc'是C,'new'是C++ – 2013-02-17 13:12:36

+1

http://stackoverflow.com/questions/9573748/variable-length-struct-nonstandard-in-c11?lq=1 – user93353 2013-02-17 13:12:37

+0

@EdHeal:不正確。 'malloc'既是C又是C++。 – 2013-02-17 13:19:09

回答

4

Even in C, this is undefined and non-portable。 GCC有意讓你擺脫它,但其他的實現可能不會。這是因爲你正在訪問超出其範圍的數組。

This "trick" is precisely as valid in C++ as it is in C。也就是說,隨時可以在GCC中使用它,GCC文檔說它支持,但它永遠不會是「定義明確,有效的C++」。 「

+2

我依稀記得,在一些廣泛使用的OSS應用程序中,實際上存在一個相當大的錯誤,這是由於依賴於超出邊界的指針訪問。這可能看起來很安全,但最明顯的不是,優化器可以抽出一些非常時髦的特技,使這些代碼變得危險。 – 2013-02-17 13:45:08

-1

除了使用固定長度或註釋* 之外沒有其他方法,因爲編譯器必須知道您的歌曲結構有多長,並且每個結構具有相同的長度。

,所以你必須使用一個音符*或矢量

+0

我擔心這個答案拒絕或錯過靈活陣列黑客的前提。 – 2013-02-17 13:24:04