在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上工作)。
编辑:我可能忘记了重要的事情。我需要提出一个可以通过“静态数组接口”使用的数组,我的意思是多个方括号(每个维度一个)。答案 0 :(得分:2)
第一个a
不是数组,而是指向未指定长度数组的指针。你想要做的是不可能的。您不能拥有全局变量长度数组
但是在目前的情况下,您可以使用它来访问分配给a
for(int i=0;i<2; i++){
int *ptr = *a + 2*i;
for(int j=0;j<2; j++){
ptr[j] = i*2 + j;
}
}
答案 1 :(得分:0)
您无法声明全局多维 VLA,因为即使您使用指针,也必须在声明时知道除第一个之外的所有维度。
我最好的尝试是使用全球void *
。在C void *
中是一种特殊的指针类型,可用于存储指向任何类型的指针,通常用于 opaque 指针。
您可以这样做:
void *a; // opaque (global variable length array) pointer
int main() {
//defining it's size
a = malloc(sizeof(int) * 2 * 2); // the global opaque pointer
int(*a22)[2] = a; // a local pointer to correct type
for (int i = 0; i<2; i++) {
for (int j = 0; j<2; j++) {
a22[i][j] = i * 2 + j;
}
}
return 0;
}
当您需要访问全局VLA 时,将opaque global的值分配给本地VLA指针,然后可以正常使用它。您可能还必须将维度存储在全局变量中......