我需要宣告一個 size 的結構陣列symbolnum,但是因為symbolnum變數 C 在我撰寫以下代碼時會產生錯誤:
extern int symbolnum;
struct SymbTab stab[symbolnum];
我已經嘗試過:
extern int symbolnum;
const int size = symbolnum;
struct SymTab stab[size];
有沒有辦法在不使用動態記憶體分配函式(例如malloc()使用非常大的數字初始化陣列的大小)的情況下實作這一點?
uj5u.com熱心網友回復:
全域陣列的大小必須在編譯時固定。VLA 只允許在函式內部使用。
如果symbolnum直到運行時才知道的值,則需要宣告stab為指標型別并為其動態分配記憶體。
或者,如果陣列不占用超過幾十 KB,則可以在main函式中定義 VLA并設定指向它的全域指標。
uj5u.com熱心網友回復:
C11 及更高版本允許將可變長度陣列作為可選功能。C99 允許將它們作為強制性功能。但是,在任何情況下都不允許在檔案范圍內使用 VLA,這似乎是您要實作的目標。
無論如何,根據 C 語意,檔案范圍的 VLA 沒有任何意義。在檔案范圍內宣告的物件具有靜態存盤持續時間,這意味著它們在程式執行開始時或之前就存在,并且一直存在到程式終止。這意味著在變數可以取其初始值(零或整數常量運算式)以外的任何值之前,需要陣列長度,因此不妨直接使用該初始值。
此外,即使 C99 是當前標準,一些 C 實作(特別是 MSVC)也從未實作 VLA,并且現在不打算這樣做,因為該功能在當前標準中是可選的。
所以,
有沒有辦法在不使用動態記憶體分配函式(例如
malloc()使用非常大的數字初始化陣列的大小)的情況下實作這一點?
這在一定程度上取決于您的確切需求(以及您的 C 實作),但可能不是。一種可能性是在 中使用本地 VLA main(),或者在其他一些函式中使用,其執行包含對陣列的全部需求。如果你的 C 實作支持它,你可以在那里宣告一個 VLA,并傳遞一個指向它的指標。但是請注意,如果您需要的元素數量的上限確實是“一個非常大的數字”,那么這不太合適。VLA 通常在堆疊上分配,這對它們的大小有相對嚴格的限制。
uj5u.com熱心網友回復:
“有沒有辦法在不使用 malloc() 等動態記憶體分配函式或使用非常大的數字初始化陣列大小的情況下實作這一點?”
如果您可以使用可變長度陣列(VLA),那么是可以做到的。下面說明了一種方法......
使用struct全域空間中的定義(例如,.c 檔案的頂部或 .h 檔案中)可以使用 VLA 創建其本地陣列實體,struct記住鏈接中提到的使用 VLA 的規定。struct然后可以將 VLA陣列作為函式引數傳遞,以便在被呼叫的函式中使用,或者更新和回傳,就像使用任何其他函式引數一樣。這是一個簡單的例子:
//define either at top of .c file in file global space
//or in a header file that is included in any .c. Then
//the typedef num_s can be used to create instances where needed
//
typedef struct SymbTab{
int iVal;
double dVal;
} SymbTab_s;
void populate_struct(size_t symbolnum, SymbTab_s *stab);
int main(void)
{
size_t symbolnum = 0;//(using size_t). note, as you describe, this
//comes after flex analysis normally, but for
//this demo user input is used for simple
// example of dynamically sizing array.
printf("Enter symbolnum of struct array:\n");
scanf("%zu", &symbolnum);
SymbTab_s stab[symbolnum]; //dynamically sized array of SymbTab_s
memset(stab, 0, sizeof(SymbTab_s) * symbolnum); //initialize new array
populate_struct(symbolnum, stab); //pass as function argument and update values
//demo updated values
for(int i=0; i < symbolnum; i )
{
printf("%d, %lf\n", stab[i].iVal, stab[i].dVal);
}
return 0;
}
//simple function to demo form of parameters
//note size parameter is passed first
void populate_struct(size_t symbolnum, SymbTab_s *stab)
{
for(int i=0; i < symbolnum; i )
{
stab[i].iVal = i;
stab[i].dVal = 1.0*i;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/364876.html
上一篇:如何從flasksqlalchemy資料庫中洗掉或修改表
下一篇:如何在C中檢查字串是否包含某個值
