【发布时间】:2018-02-02 07:20:22
【问题描述】:
在C语言中,由于我使用编译器生成的框架,我需要使用全局可变长度数组。
但是,直到运行时我才能知道其尺寸的大小(尽管例如 argv)。
为此,我想声明一个大小未知的全局变长数组,然后定义它的大小。
我就是这样做的:
int (*a)[]; //global variable length array
int main(){
//defining it's size
a = (int(*)[2]) malloc(sizeof(int)*2*2);
for(int i=0;i<2; i++){
for(int j=0;j<2; j++){
a[i][j] = i*2 + j;
}
}
return 0;
}
但是,这不起作用:我收到 invalid use of array with unspecified bounds 错误。我怀疑是因为即使定义了它的大小,它的原始类型也没有定义较大步幅的大小。
有人知道如何解决这个问题吗?使用 C99(没有 C++),它应该是相当标准的(至少在 gcc 和 icc 上工作)。
编辑:我可能忘记了一些重要的事情。我需要提出一个可通过“静态数组接口”使用的数组,我的意思是多个方括号(每个维度一个)。
【问题讨论】:
-
如果你还是要去
malloc它,VLA 的意义何在?只需使用指针。 -
@DeiDei VLA 用于第二维。它是一个二维数组。
-
你不能做你需要的,如果这是绝对必要的,使用一个指针数组。
-
您不能对在文件范围、结构或联合中定义的变量使用可变修改类型(VLA),或者......您不能做您想做的事情做。您将不得不使用一个简单的指针和一个长度,可能在一个结构中:
int *a = 0; int a_size = 0;,然后适当地分配值。 (或者一个指针数组——int **a = 0;) -
您可以声明一个
void*和一个size变量,然后每次必须使用时将void*转换为适当大小的VLA。