簡體   English   中英

我的聲明中出現“在文件范圍內可變修改'隊列'”的錯誤?

[英]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 malloccalloc動態分配數組,而不是可變長度數組。

在剛開始學習該語言的人中,這似乎是一個常見的錯誤假設。

int max;
int queue[max];

queue的大小不會綁定到max的值。 它的大小在創建數組時固定為max的值。

因此,您需要先將值讀取到max然后再創建queue 這要求您在 function 內部而不是外部創建queue

暫無
暫無

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

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