c语言 未知大小数组,关于C#:大小未知的可变长度数组

在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。

如果大小不知道,则不能使用未指定的长度,如果2D数据,则应使用指针,然后int **a

@ThiruShetty int**和int[][]完全不同... @AjayBrahmakshatriya这里的问题是,它不允许我使用多括号运算符访问值,因此我必须这样做:((@DeiDei好,告诉我如何使用带有单个指针的多个方括号来访问数组值...

@Viridya您不能在编译时声明未知长度的数组。您可以通过参数传递方式argv来实现,但这将在main内部。如果要全局,则应使用指针或知道数组的长度。

参见C11 6.7.6.2数组声明符2和附近的文本(例如4和5)。

首先不要使用全局变量,所有问题都会消失。

@JonathanLeffler谢谢,我检查了一下。

@Lundin很容易发现那些从来没有编程过Celcius / Farhenheit转换器的人:)

继续@Lundin的想法。拥有全局数组通常确实是个坏主意,如果将(指针)VLA作为函数的参数传递,则效果会更好。如果沿VLA之前的尺寸长度传递,则可以使用此类野兽。

@JensGustedt您似乎不了解的是,我必须使用全局固定数组才能使用特定的库,并且我必须在编译时不固定数组的长度,从而导致"我需要使用全局VLA" 。是的,这是愚蠢的,是的,如果我可以使用malloc或本地VLA,我可以这样做,但是不可以。

@Viridya,那么您真的是该模型的极限。不允许将VLA和派生作为全局变量的原因是,除了数组本身之外,它们还具有隐藏状态,即维的长度。如果要向后兼容ABI级别上的C数组的其他处理,则无法在不同的转换单元之间轻易公开此隐藏状态。从根本上说,一个函数现在永远无法接收到的源于VLA。原则上,如果您的VLA为static,这仍然可行,但这不是委员会选择的路径。

第一个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标准,这是不可能的。

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值