大小未知的可变长度数组

时间:2018-02-02 07:20:22

标签: c arrays

在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上工作)。

编辑:我可能忘记了重要的事情。我需要提出一个可以通过“静态数组接口”使用的数组,我的意思是多个方括号(每个维度一个)。

2 个答案:

答案 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指针,然后可以正常使用它。您可能还必须将维度存储在全局变量中......