首页 > 其他分享 >C语言中的变长数组

C语言中的变长数组

时间:2022-09-26 00:33:54浏览次数:56  
标签:变量 C89 C99 C语言 分配内存 变长 数组 长度

问:C语言中定义数组大小的时候可以使用变量吗?还是只能使用常量或者常量表达式??

1 目前经常使用的C语言有三个版本,分别是 C89、C99 和 C11。C89(也称 ANSI C)是较早的版本,也是最经典的版本,国内大学几乎都是以该版本为基础进行授课。C99 和 C11 是后来对 C89 的升级,增添了一些新内容(不多),语法更加灵活了,同时兼容 C89。

2  各种编译器都能很好地支持 C89 标准,但对 C99 的支持却不同:开源组织的 GCC 和 Xcode 使用的 LLVM/Clang 已经支持了大部分(几乎全部)的 C99 标准,而微软的 VC、VS 对 C99 却不感兴趣,直到后来的 VS2013、VS2015、VS2017 才慢慢支持,而且支持得还不好。

3  为什么要讨论这个问题呢?因为 C89 和 C99 对数组做出了不同的规定:

   3.1  在 C89 中,必须使用常量表达式指明数组长度;也就是说,数组长度中不能包含变量,不管该变量有没有初始化。
   3.2  在 C99 中,可以使用变量指明数组长度。

4 下面的代码使用常量表达式指明数组长度,在任何编译器下都能编译通过:

  5 下面的代码使用变量指明数组长度,在 GCC 和 Xcode 下能够编译通过,而在 VC 和 VS(包括 VC 6.0、VS2010、VS2013、VS2015、VS2017 等)下都会报错

 

 6   变量的值在编译期间并不能确定,只有等到程序运行后,根据计算结果才能知道它的值到底是什么,所以数组长度中一旦包含了变量,那么数组长度在编译期间就不能确定了,也就不能为数组分配内存了,只有等到程序运行后,得到了变量的值,确定了具体的长度,才能给数组分配内存,我们将这样的数组称为变长数组(VLA, Variable Length Array)。

      普通数组(固定长度的数组)是在编译期间分配内存的,而变长数组是在运行期间分配内存的。

7  变长数组仍然是静态数组     注意,变长数组是说数组的长度在定义之前可以改变,一旦定义了,就不能再改变了,所以变长数组的容量也是不能扩大或缩小的,它仍然是静态数组。以上面的代码为例,第 3 行代码是数组定义,此时就确定了数组的长度,在此之前长度可以随意改变,在此之后长度就固定了。 8 变长数组的实现

 9 可变长度数组的限制

        1 必须是自动变量,即:不能使用static、extern关键字修饰

        2 必须先声明,再另起一行进行赋值操作,不能使用定义写法(即声明的时候直接初始化)。

 

                                 

 

 

标签:变量,C89,C99,C语言,分配内存,变长,数组,长度
From: https://www.cnblogs.com/xa-baiyulong/p/16729509.html

相关文章

  • go 稀疏数组
     稀疏数组实现:packagemainimport"fmt"typeSparseArraystruct{ colint rowint valueint}funcmain(){ //源数据格式: /* 000......
  • 怎么写出数组扁平化?如何手写flat函数
    手写一下数组扁平化flat(),但是发现居然没有一个能够完成写出来,所以打算总结一下如果遇到了数组扁平化的题目(也可以叫做手动封装flat()方法),到底应该怎么写,怎么写可......
  • js数组去重的方法
    一、利用Set()+Array.from()Set对象:是值的集合,你可以按照插入的顺序迭代它的元素。Set中的元素只会出现一次,即Set中的元素是唯一的。Array.from() 方法:对一个类似数组......
  • 数组遍历的方法
    数组遍历的方法forEach类似与for循环不会改变原数组将数组中的2全部加1constarr=[1,2,3,2]varnewArr=[]arr.forEach(v=>{if(v===2){v=v+1}......
  • C语言隐式类型转换
    在c语言中,不同的类型的数据相加最终会转换为同一种数据类型,转换过程由编译器完成。不同类型之间运算按照如下表的关系转换。  参考:https://www.csdn.net/tags/MtT......
  • vue中检测不到数组或者对象发生改变,如何解决? vue更新数组时触发视图更新的方法
    vue中检测不到数组或者对象发生改变,如何解决? this.$set(对象/数组,键,值)Vue.set(对象/数组,键,值)给对象增加新属性、给数组增加属性都可以响应!this.$delete(对......
  • 方法引用-数组的构造器引用
    方法引用-数组的构造器引用ArrayBuilder接口Demo类......
  • 算法 玩转数据结构 2-4 数组中查询元素和修改元素
    1重点关注1.1toString方法范式参考coding 1.2coding 2课程内容coding 3Coding3.1coding看4packagecom.......
  • C语言max宏的进化
    C语言max宏的进化lv1:shit#defineMAX(a,b)a>b?a:b问题所在不必多言lv2:角度:参数也可为expr解:#defineMAX(a,b)(a)>(b)?(a):(b)bug示例:#i......
  • Java学习数组
    ​Java中的数组​ ​一、数组定义格式​1、数组概述:一次性声明大量的用于存储数据的变量,要存储的数据通常都是同类型数据,例如:考试成绩 2、什么是数组:是用于......