[英]I am getting an error in my declaration stated “variably modified 'queue' at file scope”?
這是一段代碼。 我應該怎么做才能使queue
全局化並從用戶那里獲取最大大小?
#include <stdio.h>
int max;
int queue[max];
int main()
{
scanf("%d",&max);
return 0;
}
您在文件 scope 中聲明了一個可變長度數組
int queue[max];
因為聲明中的元素數量不是常數 integer 表達式。
在文件 scope 中聲明的對象具有 static 存儲持續時間。 但可變長度 arrays 應具有自動存儲期限。 因此,您不能在文件 scope 中聲明可變長度數組。
此外,數組聲明中使用的變量max
默認初始化為零。 在任何情況下,即使在塊 scope 中,您也不能聲明元素數等於 0 的可變長度數組。
來自 C 標准(6.7.6.2 數組聲明符)
2 如果一個標識符被聲明為具有可變修改類型,它應該是一個普通標識符(如 6.2.3 中定義的),沒有鏈接,並且具有塊 scope 或 function8 原型 Z31A1FD140EC91BEF2D11E2。 如果標識符被聲明為 object 和 static 或線程存儲持續時間,則它不應具有可變長度數組類型。
和
5 如果大小是不是 integer 常量表達式的表達式:如果它出現在 function 原型 scope 的聲明中,則視為被 *; 替換否則,每次對其進行評估時,它的值都應大於零。 可變長度數組類型的每個實例的大小在其生命周期內不會改變。 如果 size 表達式是 sizeof 運算符的操作數的一部分,並且更改 size 表達式的值不會影響運算符的結果,則未指定是否計算 size 表達式。
你至少應該重寫你的程序
#include <stdio.h>
int main()
{
int max;
scanf("%d",&max);
int queue[max];
return 0;
}
這是一個演示程序。
#include <stdio.h>
int main(void)
{
size_t max;
while ( !( scanf( "%zu", &max ) == 1 && max != 0 ) );
int queue[max];
printf( "The size of the array is %zu\n", sizeof( queue ) );
return 0;
}
如果輸入10
那么程序 output 可能是
The size of the array is 40
即40
是具有10
int
類型元素的可變長度數組queue
占用的 memory 范圍的大小。
請注意,您可能不會在其聲明中初始化可變長度數組。
您可以使用標准 C function malloc
或calloc
動態分配數組,而不是可變長度數組。
在剛開始學習該語言的人中,這似乎是一個常見的錯誤假設。
int max;
int queue[max];
queue
的大小不會綁定到max
的值。 它的大小在創建數組時固定為max
的值。
因此,您需要先將值讀取到max
,然后再創建queue
。 這要求您在 function 內部而不是外部創建queue
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.