第六章 C语言数组_C语言变长数组:使用变量指明数组的长度

article/2025/8/30 9:31:07

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

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

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

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


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

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

在实际编程中,有时数组的长度不能提前确定,如果这个变化范围小,那么使用常量表达式定义一个足够大的数组就可以,如果这个变化范围很大,就可能会浪费内存,这时就可以使用变长数组。请看下面的代码:

在 GCC 和 Xcode 下的运行结果:
Input string length: 100↙
Input a string: http://c.biancheng.net/cpp/u/jiaocheng/↙
http://c.biancheng.net/cpp/u/jiaocheng/

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

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

变长数组仍然是静态数组

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

一种“自欺欺人”的写法

有些初学者在使用变长数组时会像下面一样书写代码:

先定义一个变量 n 和一个数组 arr,然后用 scanf() 读入 n 的值。有些初学者认为,scanf() 输入结束后,n 的值就确认下来了,数组 arr 的长度也随即确定了。这种想法看似合理,其实是蛮不讲理,毫无根据。

从你定义数组的那一刻起(也就是第二行代码),数组的长度就确定下来了,以后再也不会改变了;改变 n 的值并不会影响数组长度,它们之间没有任何“联动”关系。用 scanf() 读入 n 的值,影响的也仅仅是 n 本身,不会影响数组。

那么,上面代码中数组的长度究竟是什么呢?鬼知道!n 是未初始化的局部变量,它的值是未知的。

修改上面的代码,将数组的定义放到最后就没问题了:

在定义数组之前就输入 n 的值,这样输入的值才有用武之地。


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

相关文章

C语言 数组长度

借助sizeof()函数 # include <stdio.h> int main(void) { int a[10] {0};printf("sizeof(a) %d\n", sizeof(a));return 0; }sizeof(a) 40 ,数组 a 是 int 型的&#xff0c;每个元素占 4 字节&#xff0c;所以长度为 10 的数组在内存中所占的字节数就是 4…

C语言0长度数组(可变数组/柔性数组)详解

CSDNGitHubC语言0长度数组(可变数组/柔性数组)详解AderXCoding/language/c/zero_length_array 本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可, 转载请注明出处, 谢谢合作 1 零长度数组概念 众所周知, GNU/GCC 在标准的 C/C 基础上做了有实用性…

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

疑问&#xff1a;C语言的数组长度能用变量指定吗&#xff1f; 回答&#xff1a;在支持C99的编译器下可以。 一、背景简介 C89/C90&#xff1a; C89即ANSI C&#xff0c;ANSI&#xff1a;美国国家标准学会&#xff08;American Natinal Standards Institute&#xff09;C90即I…

空间平面及其方程

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

三维空间平面拟合MATLAB

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

空间曲面构造及其方程

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

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

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

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

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

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

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

平面方程

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

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

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

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

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

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

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

三维空间中的平面方程

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

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

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

三维空间平面方程

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

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

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

线代基础

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

随机网络和无标度网络

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

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

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