Abh*_*nav 12 c arrays static gcc
可能重复:
我们可以给静态数组的大小一个变量
我在其中一个子文件中定义一个数组,如下所示.
static int arr[siz];
Run Code Online (Sandbox Code Playgroud)
这siz是子文件可用的全局变量.但是gcc编译器会产生以下错误:
<filename>: <line_num> : error : storage size of ‘arr’ isn’t constant
Run Code Online (Sandbox Code Playgroud)
为什么我不能定义一个static可变大小的数组?
编辑:这似乎只是static int类型的问题.如果我将变量类型arrfrom 更改static int为int,则错误消失,即使数组的大小仍依赖于变量siz.
Alo*_*ave 14
由于您声明的数组的大小不是常量,因此您拥有的是可变长度数组(VLA).c99标准允许VLA,但存在一些与之相关的限制.你不能有与可变长度数组static或extern存储类说明.
您有一个具有static存储规格的VLA,C99标准不允许这样做.
参考:
c99标准:6.7.5.2/8
示例4可变修改(VM)类型的所有声明必须处于块范围或函数原型范围.使用static或extern存储类指定器声明的数组对象不能具有可变长度数组(VLA)类型.但是,使用静态存储类指定器声明的对象可以具有VM类型(即指向VLA类型的指针).最后,所有使用VM类型声明的标识符必须是普通标识符,因此不能是结构或联合的成员.
因此,如果您需要具有static存储说明符的动态大小数组,则必须使用在堆上分配的动态数组.
#define MAX_SIZE 256
static int* gArr;
gArr = malloc(MAX_SIZE * sizeof(int));
Run Code Online (Sandbox Code Playgroud)
编辑:
回答您更新的问题:
当您static从声明中删除关键字时,声明的数组的存储说明符从static全局变为全局,请注意上面的标准引用,它清楚地提到了不允许使用VLA static和extern存储规范的限制.显然,您可以拥有具有全局存储规范的VLA,这是您删除static关键字后的内容.
您在编译时分配数组,因此编译器必须提前知道数组的大小。您必须在声明siz之前声明为常量表达式arr,例如:
#define siz 5
Run Code Online (Sandbox Code Playgroud)
或者
enum ESizes
{
siz = 5
};
Run Code Online (Sandbox Code Playgroud)
或者,如果您需要在运行时确定其大小,您可以使用malloc以下命令在堆上分配它:
static int* arr;
arr = (int*)malloc(siz * sizeof(int))
Run Code Online (Sandbox Code Playgroud)
编辑:正如 eddieantonio 所提到的,我的回答对 C89 有效。在 C99 中,允许声明可变大小的数组。
| 归档时间: |
|
| 查看次数: |
21749 次 |
| 最近记录: |