c99标准下数组新特性———可变长度数组与数组字面量(复合字面量)
一、可变长度数组VLA一、什么是可变长度数组误区澄清“可变”指的是“定义时可变”不是“定义后可扩容”很多人听到“可变长度数组”第一反应是“这个数组像气球一样能随时吹大或缩小”。这是错的。在C99标准中可变长度数组VLA的“可变”仅仅是指数组的长度可以由一个变量在运行时决定而不必像传统C89那样必须用一个常量**如#define SIZE 10在编译时决定。C89固定数组长度必须是常量。cint arr[10]; // 正确10是常量 int n 5; int arr2[n]; // 错误C89不允许变量做长度C99可变长度数组长度可以是变量。cint n 5; int arr[n]; // 正确C99允许这就是VLA // 此时arr的长度在运行时被确定为5占用的内存大小就固定了二、可变长度数组的作用和不确定性cint n 5; int arr[n]; // 此时arr长度确定为5占用20个字节int占4字节 n 100; // 哪怕把n改成100arr的长度依然是5不会变 // 如果你试图访问 arr[10]属于数组越界程序会崩溃或出现野值。三、那VLA到底有什么用既然不能扩容要它何用它的价值在于处理函数参数和临时小数组时非常灵活以前你要写一个处理任意大小数组的函数如果数组很大必须用malloc在堆heap上动态分配比较慢还要记得释放。有了VLA你可以直接在栈stack上快速创建一个大小恰到好处的数组c// 这个函数可以处理任意尺寸的二维矩阵尺寸由参数传入 void processMatrix(int rows, int cols, int matrix[rows][cols]) { // 这里可以直接使用matrix长度由调用时传入的rows和cols决定 } int main() { int x 3, y 4; int myArr[x][y]; // 运行时才确定大小3行4列创建在栈上速度极快 processMatrix(x, y, myArr); }总结一句话VLA解决了“编译时不知道大小但运行时才知道”的问题但它依然是“一锤子买卖”——确定了就改不了。四、为什么可变长度数组又是“不可变的”有人会问“既然允许用变量来定义长度了为什么还要规定‘确定后不能改’”我们可以分为三个瞬间看待这个可变过程。确定时机普通数组在编译时就定好了大小VLA在程序运行到这一行代码时根据当时变量的值比如上面的n来确定大小。不可变性一旦这行代码执行完这个数组的长度就彻底锁死了。在它的生命周期内你绝对无法通过修改n的值来改变arr的长度。1. 第一瞬间程序运行到这里读取变量值当CPU中央处理器执行到int arr[n];这一行代码时它做的第一件事就是去内存里把变量n当前的值取出来。假设此时n里面存的是数字10。这个动作发生在程序运行的微秒级别就是你说的“一瞬间”。2. 第二瞬间计算并分配内存栈指针移动CPU拿到数字10后会立刻计算需要多少字节比如10 * 4 40字节。3. 第三瞬间数组长度“被遗忘”这是最关键的一点也是解开你矛盾感的金钥匙。当CPU把栈顶指针移动完毕给数组腾出空间后CPU就彻底把n的值那个10给忘了。总结看似加上变量为可变性实际上只是对于编译期当程序运行起来数组长度就是不可变性。二、数组字面量一、什么是复合字面量什么是复合字面量传统说法数组字面量就是直接用花括号{}括起来的一组数据值用来表示一个数组类型的常量数据。复合字面量Compound Literal是 C99 标准引入的一个语法特性它的核心就是在数组字面量前面加上类型名把它变成一个带类型的临时数据块。对比一下数组字面量不带类型复合字面量带类型写法{1, 2, 3}(int[3]){1, 2, 3}区别没有类型只能用在初始化场景有类型可以独立使用本质上复合字面量就是“带类型的数组字面量”。二、为什么需要这个类型因为 C 语言是强类型语言编译器必须知道一段数据的类型才能正确处理它。当你写{1, 2, 3}时它只是一堆数字编译器不知道它是int数组还是long数组所以它只能出现在初始化赋值给某个已知类型变量的地方。但当你写成(int[3]){1, 2, 3}时编译器一眼就认出这是一个包含 3 个 int 类型元素的数据块。有了类型它就可以独立出现在代码的任何位置了。三、复合字面量的本质是什么它就是一个临时存在的匿名数组。“临时”它不像变量那样有固定的生命周期用完就没了。“匿名”它没有名字所以不能在其他地方通过名字引用它。你可以把它理解成在代码里随手写出的一块数据随用随扔。四、它最基本的用法既然复合字面量是一个有类型的数组数据它最基本的用法就是直接取出它的地址赋给指针然后使用。cint *p (int[3]){10, 20, 30};这一行干了什么事在内存中创建了一个匿名数组存着{10, 20, 30}把数组的起始地址赋给指针变量p之后通过p[0]、p[1]、p[2]就能访问这些数据如果不用复合字面量想达到同样效果必须先定义一个变量cint temp[3] {10, 20, 30}; int *p temp;五、它的存储位置复合字面量在内存中的位置取决于它出现在哪里出现在函数内部分配在栈上函数返回后就销毁。出现在函数外部全局分配在静态存储区整个程序运行期间都存在。这意味着如果你在一个函数里创建了复合字面量并返回它的指针千万不要在函数外面使用这个指针——因为那块内存已经没了。最后总结复合字面量省掉了定义变量这一步代码更简洁。

相关新闻

Grok AI编程助手性价比评测:Spring Boot、Vue 3与Python实战指南

Grok AI编程助手性价比评测:Spring Boot、Vue 3与Python实战指南

如果你最近在关注 AI 编程助手,可能已经注意到一个现象:市面上的选择越来越多,但真正能在「性价比」上打动开发者的却不多。不少工具要么价格偏高,要么功能局限,要么对中文环境支持不佳。而最近,Grok 团队公…

2026/9/28 7:32:50 阅读更多 →
Vaadin Flow组件开发进阶:创建自定义UI组件的7个技巧

Vaadin Flow组件开发进阶:创建自定义UI组件的7个技巧

Vaadin Flow组件开发进阶:创建自定义UI组件的7个技巧 【免费下载链接】flow Vaadin Flow is a Java framework binding Vaadin web components to Java. This is part of Vaadin 10. 项目地址: https://gitcode.com/gh_mirrors/flow4/flow Vaadin Flow是一个…

2026/9/28 15:00:38 阅读更多 →
如何快速入门PyTorch NLP:nlp-pytorch-zh新手教程

如何快速入门PyTorch NLP:nlp-pytorch-zh新手教程

如何快速入门PyTorch NLP:nlp-pytorch-zh新手教程 【免费下载链接】nlp-pytorch-zh 《Natural Language Processing with PyTorch》中文翻译 项目地址: https://gitcode.com/gh_mirrors/nl/nlp-pytorch-zh 想要掌握PyTorch自然语言处理技术?这篇完…

2026/9/29 22:58:54 阅读更多 →

最新新闻

β-环糊精组合修饰全解析:PEG链连接FITC、Biotin、DBCO的设计与应用

β-环糊精组合修饰全解析:PEG链连接FITC、Biotin、DBCO的设计与应用

拿到“PEG-荧光素修饰β-环糊精,β-CD-PEG-FITC,β-CD-PEG-Biotin,DBCO-PEG修饰β-环糊精,β-CD-DBCO-PEG”这一串产品名时,多数人的第一反应是“这到底是个东西还是好几个东西”。其实这是一类典型的组合修饰型环糊精…

2026/10/1 18:57:55 阅读更多 →
C++工厂方法模式实战:从日志系统到调试排查全解

C++工厂方法模式实战:从日志系统到调试排查全解

聊到C里的创建型设计模式,工厂方法模式(Factory Method)是我在工程实践中用得最频繁,也最容易被低估的一个。早些年我在面试候选人的时候,几乎每次都会问到一个场景:一段代码里有七八个if分支去创建不同类型…

2026/10/1 18:57:55 阅读更多 →
Madeira 整合 Wine、FEX-Emu 与 DXMT:ARM 平台运行 x86-64 Windows 程序实战

Madeira 整合 Wine、FEX-Emu 与 DXMT:ARM 平台运行 x86-64 Windows 程序实战

1. 从“Madeira”这个名字说起:它到底想解决什么问题 第一次看到“Madeira”这个项目名,很多人会以为是某个葡萄酒产区的工具,或者干脆是个地名相关的应用。但结合热搜词里的 Wine、FEX-Emu、DXMT、x86-64 这几个关键词,方向就清晰…

2026/10/1 18:57:55 阅读更多 →
声音克隆 + 文本转语音:narrator-ai-cli-skill 独立任务实战,AI 解说大师配音两大技能

声音克隆 + 文本转语音:narrator-ai-cli-skill 独立任务实战,AI 解说大师配音两大技能

声音克隆 文本转语音:narrator-ai-cli-skill 独立任务实战,AI 解说大师配音两大技能 【免费下载链接】narrator-ai-cli-skill AI 解说大师 — Agent skill;封装 narrator-ai-cli 供 Claude/Codex 等工具调用 项目地址: https://gitcode.co…

2026/10/1 18:57:55 阅读更多 →
Windows英文系统中文显示异常的注册表级修复方案

Windows英文系统中文显示异常的注册表级修复方案

1. 问题本质与真实场景还原这个问题我从2015年就开始反复处理,不是什么新毛病,但每次Windows大版本更新(比如1809、20H2、22H2)它就准时回来“打卡”。核心现象非常典型:你把系统语言从中文改成英文(比如为…

2026/10/1 18:57:55 阅读更多 →
C++桥接模式四种实现:从指针到std::variant的工程实践

C++桥接模式四种实现:从指针到std::variant的工程实践

从"类和类纠缠"到"接口和实现各过各的"做C开发这么多年,我一直觉得设计模式这事儿最怕"背名字"。桥接模式(Bridge Pattern)就是个典型——很多人能把定义背出来:"将抽象部分与实现部分分离&am…

2026/10/1 18:56:55 阅读更多 →

日新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/1 1:01:17 阅读更多 →