【问题标题】:Variable length array with unknown size未知大小的可变长度数组
【发布时间】: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。

标签: c arrays


【解决方案1】:

First 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;
    }
}

【讨论】:

  • 确实,对术语感到抱歉。哼,按照标准这是不可能的?
  • @Viridya;是的。按照 C 标准这是不可能的。
【解决方案2】:

你不能声明一个全局的多维 VLA,因为即使你使用指针,除了第一个维度之外的所有维度都必须在声明时知道。

我最好的尝试是使用全局void *。在C语言中void *是一种特殊的指针类型,可以用来存储指向任意类型的指针,常用于不透明指针。

你可以在这里做:

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时,你将不透明的全局的值赋值给一个本地的VLA指针,然后就可以正常使用了。您可能还必须将尺寸存储在全局变量中...

【讨论】:

  • int(*a22)[2] 是指向 固定 大小数组的指针,而不是 VLA!
猜你喜欢
  • 2015-12-18
  • 1970-01-01
  • 2019-12-12
  • 2021-07-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-03
相关资源
最近更新 更多