如何在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下面进行设置的哟!
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下面进行设置的哟!
相关文章推荐
- 可变长数组在GCC编译器中的实现
- 可变长数组在GCC编译器中的实现
- 可变长数组在GCC编译器中的实现
- 可变长数组在GCC编译器中的实现
- C语言如何在不定义函数的情况下实现递归
- 如何在C语言中实现简单的泛型编程
- 在opensu11.0下,如何用Yast命令安装gcc编译器
- C语言如何实现继承和多态
- C语言实现GPT头和分区表的读取(gcc)
- 如何查看Linux GCC编译器里预定义的宏
- 晒晒C++:虚函数的真相(VC编译器如何实现“virtual ”规则)
- 一.数组和指针的差别二.函数的好处以及使用函数的注意项。三.用c语言如何实现面向对象?c语言哪些点体现了面向对象。
- 用C语言简单演示如何借助zlib库实现文件的压缩和解压缩
- C语言如何实现遍历目录的功能
- C语言------如何实现字符串数组和整形数组在终端上任意输
- 如何实现c语言中回调java函数
- Eclipse 中的多线程编译——如何成倍提升Gcc编译器的编译速度
- 如何在configure时,将编译参数传入,改变默认的编译器gcc成arm-linux-gcc
- 如何在C语言里实现“面向对象编程”
- 用C语言如何编程实现从三个数组中各抽取几个数进行组合的问题?