繁体   English   中英

大小未知的可变长度数组

[英]Variable length array with unknown size

在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错误的invalid use of array with unspecified bounds 我怀疑这是因为即使定义了它的大小,它的原始类型也没有定义更大步幅的大小。

有人知道如何解决这个问题吗? 使用C99(没有C ++),它应该是相当标准的(至少在gcc和icc上工作)。

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

首先, 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;
    }
}

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM