我是 C 編程的新手,在本練習的開發程序中,我遇到了無法解決的錯誤:
欄位必須具有恒定大小:永遠不會支持“結構中的可變長度陣列”擴展
#include <stdio.h>
#include <stdlib.h>
int main(int argc, const char * argv[]) {
int nChapters = 2;
typedef struct {
char title[50];
char author[50];
} Heading;
typedef struct {
char title[50];
int number_pages;
} Chapter;
typedef struct {
Heading heading;
Chapter chapters[nChapters]; //Fields must have a constant size: 'variable length array in structure' extension will never be supported
} Book;
printf("\n");
system("read -p 'Press enter to continue...' ");
printf("Hello, World!\n");
return 0;
}
如果我chapters[nChapters]用 int like替換chapters[2],程式運行沒有問題。提前致謝!
uj5u.com熱心網友回復:
在 C 中,您必須使用固定長度宣告陣列,您的 nChapters 變數確實是一個變數。您可以通過簡單地添加關鍵字將其轉換為常量變數const:
const int nChapters = 2
uj5u.com熱心網友回復:
您可以使用前處理器指令#define:
#define nChapters 2
uj5u.com熱心網友回復:
問題是你假設這是顯而易見的
Chapter chapters[nChapters];
的那個值nChapters是2。對于不在 astruct或 a內的陣列,它以這種方式作業union。這是由奇怪的、非標準的、非 GCC 支持的(但在 C90 之后被 GCC 接受為擴展),而不是被稱為 VLA 或可變長度陣列的推薦功能。使用這些,可以分配一個auto類陣列。
參考GNU/GCC 標準,第 6.20 節,值得注意的是,
存盤在宣告點分配,并在包含宣告的塊作用域退出時解除分配。
C99 推薦了一種更好的方法來處理這個要求——通過使用靈活的長度陣列。
§6.7.2.1 結構和聯合說明符?18 作為一種特殊情況,具有多個命名成員的結構的最后一個元素可能具有不完整的陣列型別;這稱為靈活陣列成員。在大多數情況下,靈活的陣列成員會被忽略。特別是,結構的大小就像省略了靈活的陣列成員,只是它可能具有比省略所暗示的更多的尾隨填充。但是,當一個 . (或 ->) 運算子有一個左運算元,它是(指向)具有靈活陣列成員的結構,右運算元命名該成員,它的行為就像該成員被替換為最長的陣列(具有相同的元素型別) ) 不會使結構大于被訪問的物件;陣列的偏移量應保持為靈活陣列成員的偏移量,即使這與替換陣列的不同。如果這個陣列沒有元素,它的行為就好像它只有一個元素,但如果嘗試訪問該元素或生成一個超過它的指標,則行為是未定義的。
因此,這會將您的結構更改為:
typedef struct {
Heading heading;
Chapter chapters[];
} Book;
然后從堆動態分配記憶體使用malloc。
uj5u.com熱心網友回復:
結構體陣列成員的大小必須是一個常量運算式(跳過“靈活成員”的情況和 GCC 的 VLA-in-struct擴展)。
在 C 標準中,擁有真正命名整數常量的唯一可移植方式是使用列舉。只需更換:
int nChapters = 2;
有了這個:
enum { nChapters = 2 };
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/322581.html
標籤:C
上一篇:為什么fgets不將char指標作為第一個引數?[復制]
下一篇:如何修復C編程中的分段錯誤?
