您的位置:首页 > 编程语言 > C语言/C++

如何在C语言中实现GCC编译器中的可变长数组

2018-03-14 22:36 956 查看
大家知道变长数组的全称是什么,没错就是variable-lengtharray,简单称之为VLA。在C语言中,一直到C99标准出现之前,声明数组的时候在方括号内只能使用整数常量表达式。而C99做了很大改进,允许数组的[]中的值是整形变量或是整形表达式。今天小编会带大家学习一下:如何在C语言中实现GCC编译器中的可变长数组。

  1、可变长数组  刚刚小编已经说过了在C99标准(C99标准是 ISO/IEC 9899:1999 - Programming languages -- C 的简称,是C语言的官方标准第二版。)中,新增加了一个功能,那就是:支持可变长数组。换一句话来说,那就是现在数组的长度可以由某一个不是const变量来进行定义了。大家都应该知道,可变长数组它的空间大小直至到程序运行的时候才可以确定下来。所以仅仅只有程序在运行的时候,才可以为程序进行分配空间。另外一点,那就是在GCC编译器中,程序会在运行的时候根据实际指定的大小(就是说变量当前的值)来进行调节esp的值,这样子就可以为数组在栈上分配一个适当大小的内存空间了。小编刚刚说过,但是因为要在运行的时候我们才可以为数组分配内存空间,那么在开始分配空间之前空间的大小是完全不可以确定下来的。那么就是说分配空间的起始地址也是不可以确定下来的,就比如说:我们要在栈上面进行分配两个可变长数组的情况下。  程序一定要通过某一种方式来获得可变长数组的地址,目的就是可以为了在大家以后的代码中实现对可变长数组的内容进行引用的操作。其实在GCC编译器中会在相对于ebp(全称:extendedbasepointer,即扩展基址指针寄存器,其内存放一个指针,该指针指向系统栈最上面一个栈帧的底部。)固定的偏移量的栈上分配的一个固定大小的区域(我们称之为内情向量)来记录可变长数组的信息,就比如说数组的开始地址等。除此之外,后继的代码还可以通过内情向量中的起始地址来进行访问可变长数组。  大家还要注意一点,那就是由于数组是依靠在程序运行的时候动态的调整esp来进行分配内存空间的,所以这一种类型的数组仅仅只可以定义在栈里面,不可以定义在数据段上(即静态数组又或者是全局数组)。  2、编程代码  现在大家可以看一下小编特意找来的编程代码,希望这对大家有所帮助。具体的代码,如下图:

  温馨提示:大家一定要使用CodeBlocks编译通过,在循环的时候也一定要记得使用C99标准代码。编译的时候不要忘记了添加-std=c99参数,这个参数大家可以在Settings菜单的Compileranddebugger下面进行设置的哟!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: