简单回答:在文件范围内无法修改变量的数组是不可能的。
详细解释:
将其设置为编译时的整数常量表达式,因为数组长度必须在编译时指定。
像这样:
或者,遵循C99标准,并像GCC一样进行编译。
gcc -Wall -std=c99 test.c -o test.out
这里的问题是具有提供长度的可变长度数组可能未初始化,因此您会收到此错误。
简单地说
static int a = 6;
static int b = 3;
void any_func()
{
int Hello [a][b]; // No need of initialization. No static array means no file scope.
}
现在使用一个for循环或任何循环来填充数组。
更多信息,请参考一个演示:
#include <stdio.h>
static int a = 6;
int main()
{
int Hello[a] = {1, 2, 3, 4, 5, 6};
return 0;
}
编译
cd ~/c
clang -std=c99 vararr.c -o vararr
输出:
vararr.c:8:11: error: variable-sized object may not be initialized
int Hello[a]={1,2,3,4,5,6};
^
1 error generated.
如果你移除静态修饰符并提供初始化,那么会产生上述错误。
但是如果你保留静态修饰符和初始化,仍然会出现错误。
但是如果你移除初始化并保留 "static" 关键字,将会出现下面的错误。
error: variable length array declaration not allowed at file scope
static int Hello[a];
^ ~
1 error generated.
在文件范围内不允许使用可变长度数组声明,因此可以将其放在任何函数的函数范围或块范围内(但要记住,将其放在函数范围内必须去除初始化)
注意:由于标记为C
,将a
和b
声明为const
对你没有帮助,但在C++
中,const
将正常工作。
variably modified ‘child’ at file scope
"。 - Peter Mortensen