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

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

  1. C语言数组大小极限,C中允许的最大静态数组大小是多少?

    你的大部分问题都得到了回答,但只是给出一个让我的生活更轻松的答案: 定性地,非动态分配的数组的最大大小取决于您拥有的RAM量.它还取决于阵列的类型,例如一个int可能是4个字节,而double可能是8 ...

  2. 求二维数组的行列大小(C语言)

    我们可以利用字节来求行列大小. 假如我们规定二维数组是 int a[3][4]: 那么这个数组的字节大小是12*sizeof(int); 每一行的字节又是多少?每一列的字节又是多少? 我们可以这样求: ...

  3. c语言程序中间改变数组大小,结构中间的可变长度数组 – 为什么这个C代码对gcc有效...

    有一些使用VLA(可变长度数组)的奇怪代码,由gcc 4.6被视为有效C(C99,C11): $ cat a.c int main(int argc,char**argv) { struct args ...

  4. 计算数组A的大小与地址

    这是当时面试时遇到的一道题,我觉得要是都能答对了,那么对C语言的掌握程度已经可以达到工作的水平了. 1.先看题 已知数组A(基于32位MCU)的地址为0x80000000,数组为A[100]. 求: ...

  5. C语言不用strcmp函数比较字符串大小

    C语言不用strcmp函数比较字符串大小 #include <stdio.h> int main(){int i, res;char s1[100], s2[100];printf(&qu ...

  6. 根据数组中的某个键值大小进行排序,仅支持二维数组

    /**     * 根据数组中的某个键值大小进行排序,仅支持二维数组     *     * @param array $array 排序数组     * @param string $key 键值 ...

  7. c 语言比较三个整数大小,C 语言 —— 比较三个整数的大小并从大到小输出

    思路一:定义两个比较大小的函数,依次两两比较输出最大或最小的数字(较为繁琐,最易分析) /* C 语言比较三个整数的大小并从大到小输出 思路:定义两个比较大小的函数,依次两两比较输出最大或最小的数字 ...

  8. 比较两数大小c语言,C语言比较两个数字的大小

    问题描述: C语言比较两个数字的大小 #include int max(int a,int b); main() { int x,y; printf("input two numbers:\ ...

  9. ReDim Preserve只能改变数组最末维大小​​​​​​​

    eDim Preserve file_info(1 To i, 1 To 2) As String         file_info(i, 1) = Filename         file_in ...

最新文章

  1. char *p 与char p[N]
  2. hackerrank---Sets - Symmetric Difference
  3. java 性能调优_Java性能调优调查结果(第一部分)
  4. 配置环境_JavaJDK环境变量配置
  5. Scala 多继承问题
  6. 拉链式存储_用户维度表(拉链表的方式存储)
  7. Linux下创建指定路径下的文件夹/文件,通过get_option()传递路径
  8. shell脚本学习教程(全网最全教学)
  9. qt plugins 插件框架
  10. android horizontalscrollview属性,Android中HorizontalScrollView使用方法详解
  11. 微信、支付宝、百度(drawImage及canvasGetImageData、支付宝(getImageData))踩坑,uni-app 获取图片底色像素值
  12. 【牛客网】马三来刷题之最大差值
  13. 【雕爷学编程】Arduino动手做(76)---2路光耦继电器模块
  14. Java:缓冲流、转换流、序列化流
  15. c语言中的16进制坐标计算器,十六进制计算器_16进制计算器
  16. DDOS渗透与攻防(二)之SYN-Flood攻击
  17. 微信小程序-从注册到上架
  18. 微信订单尾号夺宝php源码,H5最新尾号夺宝源码黑色版 订单号尾数夺宝程序源代码...
  19. 年轻有为!我与94年的LeetCode CEO同台登场!
  20. C语言能干什么?手把手教你写一个简单的聊天软件

热门文章

  1. 2022-2028年中国电磁兼容产品行业市场发展前景及投资风险评估报告
  2. 关于测试环境部署的那些事儿
  3. 关于Linux使用pppd拨号,自动断网,重新拨号功能
  4. Ajax请求数据格式
  5. stm32的rxne和idle中断_stm32 USART_IT_IDLE中断 一帧数据
  6. VMware15安装MAC 解锁
  7. Ubuntu14.04 安装 Python3.6
  8. Nginx 图片、视频服务器配置
  9. linux清除cache的2种方法
  10. 拼音反查(转自大富翁)