3 回答

TA貢獻1828條經驗 獲得超4個贊
使用goto的軟件工程實踐很差,這是一個公認的“事實”。這并不是真的。有時goto很有用,特別是在處理清理和從匯編程序移植時。
靈活的陣列成員讓我覺得有一個主要用途,在我的頭頂,這是在RiscOS上映射遺留數據格式,如窗口模板格式。在大約15年前,它們對于這一點非常有用,而且我確信仍有人在那里處理那些會發現它們有用的東西。
如果使用靈活的陣列成員是不好的做法,那么我建議我們都告訴作者C99規范這個。我懷疑他們可能有不同的答案。

TA貢獻1802條經驗 獲得超5個贊
請仔細閱讀以下評論中的評論
隨著C標準化的推進,沒有理由再使用[1]了。
我不贊成的原因是,為了使用這個功能,將代碼綁定到C99是不值得的。
關鍵是你總是可以使用以下習語:
struct header { size_t len; unsigned char data[1];};
這是完全便攜的。然后,在為數組中的n個元素分配內存時,可以考慮1 data
:
ptr = malloc(sizeof(struct header) + (n-1));
如果由于任何其他原因已經將C99作為構建代碼的要求,或者您的目標是特定的編譯器,我認為沒有壞處。

TA貢獻1848條經驗 獲得超10個贊
你的意思是...
struct header{ size_t len; unsigned char data[];};
在C中,這是一個常見的習語。我想很多編譯器也接受:
unsigned char data[0];
是的,這很危險,但是再一次,它確實沒有比普通C陣列更危險 - 即非常危險;-)。小心使用它,并且僅在您真正需要未知大小的數組的情況下使用它。確保你使用malloc并使用以下內容正確釋放內存: -
foo = malloc(sizeof(header) + N * sizeof(data[0])); foo->len = N;
另一種方法是使數據只是指向元素的指針。然后,您可以根據需要將數據realloc()重新設置為正確的大小。
struct header { size_t len; unsigned char *data; };
當然,如果你問的是C ++,那么這些都是不好的做法。然后你通常使用STL向量。
- 3 回答
- 0 關注
- 501 瀏覽
添加回答
舉報