C语言的数组长度能用变量指定吗?

article/2025/8/29 18:19:00

疑问:C语言的数组长度能用变量指定吗?
回答:在支持C99的编译器下可以。


一、背景简介

C89/C90:

  1. C89即ANSI C,ANSI:美国国家标准学会(American Natinal Standards Institute)
  2. C90即ISO C,ISO:国际标准化组织(International Standard Organization)
  3. ANSI C 和 ISO C是完全相同的标准,ANSI C最终版本于1989年被批准,故叫C89。ISO C最终版本于1990年被批准,故叫C90。

C99:

  1. 1994年,由ANSI/ISO联合委员会开始修订C标准
  2. 1999年,1994年对C语言的修订引出了ISO 9899:1999的发表,它通常被称为C99

C11:

  1. 2011年,国际标准化组织(ISO)和国际电工委员会(IEC) 旗下的C语言标准委员会(ISO/IEC JTC1/SC22/WG14)正式发布了C11标准

二、环境声明

编译器版本(支持C99):
在这里插入图片描述

三、C99之可变长度数组(VLA)

c99标准中,新增了可变长度数组:Variable-length array (VLA);C11中VLA变为可选项,不是语言必备的特性。

C99之前数组用法:
在这里插入图片描述
C99可变长度数组用法:
在这里插入图片描述

思考:

  1. C99之前,数组的大小要为常量或常量表达式(sizeof()被是为视为整形常量),这就导致在源码中就明确了数组长度。
  2. C99的VLA,用变量指定数组长度,而变量的数值在程序运行过程中才能确定,这就导致可变长度数组的大小只有在运行到定义数组长度的变量后,才能确定变长数组的长度。
  3. 其实,数组的内存分配,C99之前或C99都是在程序运行的时候,才分配实际的内存。所以,只要在给数组分配实际内存之前,确定了数组长度,就OK了。而数组长度是在编译时候确定,还是在程序运行中给数组分配内存之前确定,都不影响数组。
  4. 结合3,知道可变长度数组(VLA)其实也是静态数组,即在数组分配内存之前确定长度,分配内存后就不再改变该数组长度。
  5. 由VLA的特点,当在源码中无法确定数组长度,而需要通过程序运行后才能确定数组长度,且之后数组不再需要改变大小(不会造成空间浪费也不会空间不足)的情况下,使用VLA比使用动态数组更方便。

总结

可变长度数组的限制:

  1. 必须是自动变量,即:不能使用static、extern关键字修饰
  2. 必须先声明,再另起一行进行赋值操作,不能使用定义写法(即声明的时候直接初始化)。

http://chatgpt.dhexx.cn/article/BL1CH7tp.shtml

相关文章

空间平面及其方程

目录 1. 方程类型2. 常见问题 F(x,y,z) 0 几何意义 空间中的平面 1. 方程类型 点法式 A(x - x0) B(y - y0) C(z - z0) 0 (A,B&am…

三维空间平面拟合MATLAB

1.根据一组点的坐标拟合空间平面,有两种方法: 第一种:如果在测量得到的数据中,x,y值都是确认没有误差的,而误差只是出现在z值上,则可以使用线性回归的方法,此方法最小二乘的目标是在…

空间曲面构造及其方程

1.旋转单叶双曲面 旋转单叶双曲面是直纹面,它的构造有多种方式,先看其中一种: 设直线的参数方程为: 则通过geogebra命令 bCurve(1,t,2t,t,-5,5) 绘制出的直线如图所示,它将作为旋转单叶双曲面的"直纹&quo…

三维空间:点到线的距离,点到面上的投影,直线在平面上的投影直线方程(平面束)

你好哦,这里是云切月斩(Echo_Fish),本文章如果能加深你对于高等数学知识点的理解,那么我将不胜荣幸!如果本文章存在错误请不吝赐教! 一、点到线的距离(已知一个点和直线的一般式&…

0803平面及其方程-向量代数与空间解析几何

文章目录 1 曲面方程与空间曲线方程的概念1.1 曲面方程1.2 空间曲线的方程 2 平面的点法式方程3 平面的一般方程4 两平面的夹角4.1 两平面夹角的定义4.2 夹角的余弦公式4.3 点到平面的距离 结语 1 曲面方程与空间曲线方程的概念 1.1 曲面方程 如果曲面与三元方程 ​ F ( x …

空间解析几何中那些图形和方程(大彻大悟版)

文章目录 前言一、平面及其方程平面的点法式方程平面的一般方程平面的截距式方程两平面的夹角点到平面的距离公式 二、空间直线及其方程空间直线的一般方程空间直线的对称式方程(点向式方程)空间直线的参数方程两直线的夹角直线与平面的夹角平面束方程 三…

平面方程

平面方程 原文链接: http://www.songho.ca/math/plane/plane.html 飘飘白云 译( http://www.cnblogs.com/kesalin) (转载请注明出处以及作&译者信息,非商业用途) 平面方程 平面上的一点以及垂直于该平面的法线唯一定义了 3D 空间的一个平面。 (图一)…

空间解析几何 | 平面束方程及其应用

一、对直线在平面上的另一种描述。 二、 平面束及其方程。 三、 求空间直线在平面上的投影方程。 求满足一定条件的平面方程。(注意!这个解答是不完整的!) 摘录 https://jingyan.baidu.com/article/3c48dd34cfdec1e10be358f5.htm…

已知空间一点和法向量,如何计算空间平面方程

2018-01-18 创建人:Ruo_Xiao 邮箱:xclsoftware163.com法向量N: 点P: 平面方程:

已知三点空间直角坐标求空间平面方程

已知三点p1(x1,y1,z1),p2(x2,y2,z2),p3(x3,y3,z3),要求确定的平面方程 关键在于求出平面的一个法向量,为此做向量p1p2(x2-x1,y2-y1,z2-z1), p1p3(x3-x1,y3-y1,z3-z1),平面法线和这两个向量垂直…

三维空间中的平面方程

平面方程: AxByCzD0 (参数,A,B,C,D是描述平面空间特征的常数) 如何求参数: 选择逆时针凸多边形的三个连续顶点(x1,y1,z1),(x2,y2,z2),(x3,y3,z3) 建立方程组来求A,B,C,D(为什么要选择凸多边形(暂时没想明白)) 具体解法&#xf…

空间中平面方程求解及点到平面的距离

1.空间中平面方程的一般形式为: AxByCzD0 (参数,A,B,C,D是描述平面空间特征的常数) 已知空间中3个点的坐标(x1,y1,z1),(x2,y2,z2),(x3,y3,z3),求解平面方程。 解法1.根据已知的3个点,建立3个联合方程组,进行消元&#xff1b…

三维空间平面方程

已知空间中三点,求平面方程: 三点坐标:(x1,y1,z1),(x2,y2,z2),(x3,y3,z3) 待求平面方程:AxByCzD0 求解公式: 平面法向量为(A,B,C) 空间坐标原点到平面的距离为D Matlab代码: %%%求…

空间平面方程的三种表述方式

一、一般式 任意的空间平面都可以表示一般形式: 二、点法式 假设,已知空间平面的法向量以及平面上的任意一点: 则该空间平面可以表述为: 三、三点确定一个空间平面 假设,已知空间平面上的三个不共线的空间点 则该空间平…

线代基础

矩阵: 加减乘除(除法表现为矩阵的逆) 单位矩阵: 矩阵的逆: R2空间矩阵的逆: Rn空间矩阵的逆: 求法比较简单的为消元法,其他都比较复杂。 高斯消元法求矩阵的逆: 通过矩阵的逆求解方程组&a…

随机网络和无标度网络

传统的随机网络(如ER模型),尽管连接是随机设置的,但大部分节点的连接数目会大致相同,即节点的分布方式遵循钟形的泊松分布,有一个特征性的“平均数”。连接数目比平均数高许多或低许多的节点都极少&#xf…

级联失效matlab,加权无标度网络的级联失效模型

社交网、交通网、通信网等领域均呈现无标度特性[, 是复杂网络中常见的一种现象, 不同网络中的节点和边都承载着不同形式的负载, 且负载的承受能力是有限的.加权无标度网络是指节点和边根据权值构建成的网络[, 应用在专家网等领域. 在复杂网络中, 节点和边承担的负载是不断演化的…

复杂网络-无标度网络matlab代码实现

无标度网络是进入研究生,导师丢来的第一个作业,从本科的小小程序猿进入这种乍看一眼非常高大上的东西,还是有些恐惧和兴奋的。 由于没找到中文版的 Emergence of Scaling in Random Networks 就借助Google翻译,糙糙看了一下&…

常见网络模型——BA无标度网络(使用轮盘赌算法)(python)

之前记录了一下,常见的四种网络模型——ER、BA、WS、规则图,以及如何使用python实现,具体请移步: https://blog.csdn.net/un357951/article/details/103514682 当时因为对轮盘赌算法还不熟悉,所以没有把轮盘赌算法和…

无标度网络和小世界网络的区别

无标度网络和小世界网络的最大区别是他们的度分布的差别 无标度网络的度分布式幂函数小世界是钟形正态分布,与random network 的度分布相似,点和点之间的连接时随机的小世界点和点之间的路径最短无标度网络有巨集团和剩余度的涌现,也就是说巨…