[英]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.