簡體   English   中英

為什么禁止可變長度數組:“ C90禁止可變長度數組”?

[英]Why is variable length array forbidden: “C90 forbids variable length array”?

我知道我不應該在C90中這樣做,這是相當基本的東西。

char name[strlen(s)];

ArrayLength.c:11: warning: ISO C90 forbids variable length array ‘name’

他們是否要我專門使用malloc? 我只是想了解它背后的邏輯。

禁止這樣做是因為C90不支持可變長度數組(VLA)。 就這么簡單。

您的選擇是:

  • 聲明一個固定長度的數組,該數組可以處理您要使用的最大字符串長度。
  • 動態分配數組(使用malloc )。
  • 使用為VLA提供非標准語言擴展的編譯器,例如GCC。 (我不建議這樣做,因為這意味着您最終將不得不編寫不可移植的代碼。)
  • 如果支持VLA,請改用C99。 請注意,VLA是在堆棧上分配的,如果您用完了堆棧空間,可能會引起各種問題(與malloc不同,這里沒有能夠檢查分配是否成功的概念)。

[ 注意: 如果要分配數組以復制s ,則需要使用strlen(s)+1作為大小(記住空終止符)。 ]

這並不是說“他們”不想讓您這樣做,它根本不是該語言的一部分(或者,不是在1999年之前)。 標准的解決方法是使用mallocalloca alloca本質上與可變長度數組分配相同,但不是標准函數,因此它可能並非在所有感興趣的系統上都可用。而且,有些人強烈反對使用它,但他們傾向於強烈反對可變長度數組-長度數組的原因相同。)

此警告指出,使用GNU gcc擴展是一個嚴重的可移植性問題。

該代碼是非法的,因為在編譯時不知道strlen(s)的值。 GNU gcc為基於運行時值分配的自動數組提供了擴展。 但是依靠這些會使代碼不符合該標准。

如果strlen(s)的值直到運行時才知道,則可以通過轉換為在約定數組上顯式執行分配/取消分配或使用STL容器來使代碼符合要求。(例如std :: vector )。

這是因為語言對於假定的編譯器便利性及其預期的運行時環境具有限制。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM