亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在C練習中使用靈活的陣列成員?

在C練習中使用靈活的陣列成員?

C
白豬掌柜的 2019-07-30 11:21:11
在C練習中使用靈活的陣列成員?我最近讀到在C中使用靈活的陣列成員是糟糕的軟件工程實踐。但是,該聲明沒有任何論據支持。這是公認的事實嗎?(靈活的數組成員是C99中引入的C特性,其中可以將最后一個元素聲明為未指定大小的數組。例如:)struct header {     size_t len;     unsigned char data[];};
查看完整描述

3 回答

?
明月笑刀無情

TA貢獻1828條經驗 獲得超4個贊

使用goto的軟件工程實踐很差,這是一個公認的“事實”。這并不是真的。有時goto很有用,特別是在處理清理和從匯編程序移植時。

靈活的陣列成員讓我覺得有一個主要用途,在我的頭頂,這是在RiscOS上映射遺留數據格式,如窗口模板格式。在大約15年前,它們對于這一點非常有用,而且我確信仍有人在那里處理那些會發現它們有用的東西。

如果使用靈活的陣列成員是不好的做法,那么我建議我們都告訴作者C99規范這個。我懷疑他們可能有不同的答案。


查看完整回答
反對 回復 2019-07-30
?
慕后森

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作為構建代碼的要求,或者您的目標是特定的編譯器,我認為沒有壞處。


查看完整回答
反對 回復 2019-07-30
?
慕桂英546537

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向量。


查看完整回答
反對 回復 2019-07-30
  • 3 回答
  • 0 關注
  • 501 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號