[英]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
)。 malloc
不同,這里沒有能夠檢查分配是否成功的概念)。 [ 注意: 如果要分配數組以復制s
,則需要使用strlen(s)+1
作為大小(記住空終止符)。 ]
這並不是說“他們”不想讓您這樣做,它根本不是該語言的一部分(或者,不是在1999年之前)。 標准的解決方法是使用malloc
或alloca
。 ( alloca
本質上與可變長度數組分配相同,但不是標准函數,因此它可能並非在所有感興趣的系統上都可用。而且,有些人強烈反對使用它,但他們傾向於強烈反對可變長度數組-長度數組的原因相同。)
此警告指出,使用GNU gcc擴展是一個嚴重的可移植性問題。
該代碼是非法的,因為在編譯時不知道strlen(s)的值。 GNU gcc為基於運行時值分配的自動數組提供了擴展。 但是依靠這些會使代碼不符合該標准。
如果strlen(s)的值直到運行時才知道,則可以通過轉換為在約定數組上顯式執行分配/取消分配或使用STL容器來使代碼符合要求。(例如std :: vector )。
這是因為語言對於假定的編譯器便利性及其預期的運行時環境具有限制。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.