当前位置: 首页 > article >正文

C99_C11中的复合字面量(Compound Literals)

文章目录探索C99/C11中的复合字面量Compound Literals✨什么是复合字面量基本语法为什么需要复合字面量复合字面量的类型与应用1. 数组复合字面量2. 结构体复合字面量3. 联合体复合字面量复合字面量的存储期限与作用域高级应用与技巧动态大小数组嵌套复合字面量与函数指针结合复合字面量的限制与注意事项⚠️实际应用案例总结探索C99/C11中的复合字面量Compound Literals✨在C语言的发展历程中C99和C11标准引入了许多强大的特性其中复合字面量Compound Literals是一个常被忽视但极其有用的功能。它允许开发者在代码中直接创建匿名对象从而简化数据结构的初始化和传递。本文将深入探讨复合字面量的概念、语法、应用场景并通过丰富的代码示例和图表帮助你掌握这一特性。什么是复合字面量复合字面量是C99标准引入的一种语法特性它允许你在表达式中直接创建临时对象如数组、结构体或联合体而无需先声明一个变量。本质上它是一种“匿名”的初始化方式类似于字面量常量如5或hello但用于复合类型。基本语法复合字面量的语法很简单(type_name){initializer_list}其中type_name是目标类型如数组、结构体。initializer_list是初始化列表与声明变量时的初始化器类似。例如创建一个整型数组的复合字面量(int[]){1,2,3,4}这会产生一个匿名数组类型为int[4]值为{1, 2, 3, 4}。为什么需要复合字面量在C89/C90中初始化复合类型尤其是结构体或数组通常需要先声明变量再使用它。例如structPoint{intx;inty;};structPointp{3,4};// 必须先声明pdraw_point(p);使用复合字面量你可以直接传递匿名对象draw_point((structPoint){3,4});// 无需声明变量这不仅减少了代码量还提高了可读性和灵活性特别是在函数调用或赋值时。复合字面量的类型与应用复合字面量支持多种类型包括数组、结构体和联合体。下面通过示例详细说明。1. 数组复合字面量数组复合字面量可以用于初始化或传递数组而无需定义临时变量。#includestdio.hvoidprint_array(intarr[],size_tsize){for(size_ti0;isize;i)printf(%d ,arr[i]);printf(\n);}intmain(){// 直接传递匿名数组给函数print_array((int[]){10,20,30,40},4);// 用于赋值int*ptr(int[]){1,2,3};print_array(ptr,3);return0;}输出10 20 30 40 1 2 3注意数组复合字面量的生命周期取决于其使用位置。如果定义在函数内它具有自动存储期限即函数结束时销毁如果定义在全局作用域它具有静态存储期限。2. 结构体复合字面量结构体复合字面量极大简化了结构体的初始化和传递。#includestdio.htypedefstruct{intid;charname[20];floatscore;}Student;voidprint_student(Student s){printf(ID: %d, Name: %s, Score: %.2f\n,s.id,s.name,s.score);}intmain(){// 直接传递匿名结构体给函数print_student((Student){101,Alice,95.5});// 用于赋值和修改Student s(Student){102,Bob,88.0};s.score90.0;// 可以修改print_student(s);return0;}输出ID: 101, Name: Alice, Score: 95.50 ID: 102, Name: Bob, Score: 90.003. 联合体复合字面量联合体复合字面量的用法类似但注意联合体只能初始化一个成员。#includestdio.hunionData{inti;floatf;charstr[10];};intmain(){unionData d(unionData){.i42};// 初始化整数成员printf(d.i %d\n,d.i);d(unionData){.f3.14};// 重新赋值浮点成员printf(d.f %.2f\n,d.f);return0;}输出d.i 42 d.f 3.14复合字面量的存储期限与作用域理解复合字面量的存储期限storage duration至关重要因为它影响对象的生命周期如果复合字面量出现在函数体内它具有自动存储期限即当块作用域结束时销毁。如果出现在全局作用域或使用static它具有静态存储期限程序运行时一直存在。以下Mermaid图表展示了复合字面量在内存中的生命周期流程函数内全局定义复合字面量在函数内或全局?自动存储期限块结束时销毁静态存储期限程序结束时销毁使用需谨慎避免悬空指针可安全返回指针例如在函数内返回复合字面量的指针是危险的会导致悬空指针int*get_array(){return(int[]){1,2,3};// 错误返回后数组被销毁}但静态复合字面量是安全的int*get_static_array(){staticintarr[]{1,2,3};returnarr;// 正确静态存储期限}高级应用与技巧复合字面量不仅用于简单初始化还能在高级场景中发挥威力。动态大小数组C99支持可变长度数组VLA复合字面量也可以与VLA结合#includestdio.h#includestdlib.hvoidprocess_array(size_tsize){int*arr(int[size]){0};// 初始化VLA复合字面量全0for(size_ti0;isize;i)arr[i]i*i;// 使用数组...}intmain(){process_array(5);return0;}嵌套复合字面量对于复杂数据结构如结构体数组复合字面量可以嵌套使用typedefstruct{intx;inty;}Point;typedefstruct{Point start;Point end;}Line;Line lines[]{{.start{0,0},.end{1,1}},{.start{2,2},.end{3,3}}};与函数指针结合复合字面量甚至能用于函数指针数组#includestdio.hvoidfunc1(){printf(Function 1\n);}voidfunc2(){printf(Function 2\n);}intmain(){void(*funcs[])(){func1,func2};// 使用复合字面量调用((void(*)())((void*[]){func1,func2}[0]))();return0;}输出Function 1复合字面量的限制与注意事项⚠️尽管复合字面量强大但有一些限制类型必须完全匹配复合字面量的类型必须与目标类型一致否则会导致未定义行为。不可用于静态初始化全局作用域的复合字面量必须是常量表达式。注意生命周期避免返回自动存储期限的复合字面量指针。C不支持复合字面量是C99/C11特性在C中不可用但有些编译器支持扩展。实际应用案例复合字面量在嵌入式系统、算法实现和API设计中非常实用。例如在图形编程中直接传递点或颜色值draw_line((Point){0,0},(Point){100,100},(Color){255,0,0});在算法中快速创建测试数据quicksort((int[]){64,34,25,12,22,11,90},7);如果你想深入了解C99/C11的其他特性可以参考C语言标准文档或C参考手册。总结复合字面量是C语言中一个简洁而强大的特性它通过匿名对象简化了代码编写。无论是数组、结构体还是联合体它都能让初始化更加直观和灵活。掌握复合字面量将提升你的C语言编程效率使代码更清晰、更易维护。希望这篇博客帮助你全面理解复合字面量如果有任何问题欢迎在评论区讨论。

相关文章:

C99_C11中的复合字面量(Compound Literals)

文章目录探索C99/C11中的复合字面量(Compound Literals)✨什么是复合字面量?🤔基本语法为什么需要复合字面量?🎯复合字面量的类型与应用💡1. 数组复合字面量2. 结构体复合字面量3. 联合体复合字…...

restrict关键字:提升指针性能的提示

文章目录理解 restrict 关键字:提升指针性能的提示 🚀什么是 restrict 关键字? 🤔为什么 restrict 重要? 💡如何使用 restrict? 🛠️代码示例:性能对比 📊Mer…...

集合与树形结构

一、注解说明生成树形结构 1.1 注解 Retention(RetentionPolicy.RUNTIME) Target(ElementType.FIELD) public interface TreeId { }Retention(RetentionPolicy.RUNTIME) Target(ElementType.FIELD) public interface TreeParentId { }1.2 树形节点 Data public class WisDepart…...

图解目标检测算法之CenterNet

🌞欢迎来到图解深度学习的世界 🌈博客主页:卿云阁 💌欢迎关注🎉点赞👍收藏⭐️留言📝 📆首发时间:🌹2026年3月20日🌹 ✉️希望可以和大家一起完成…...

Qwen3-ASR-1.7B惊艳效果:戏曲唱段(京剧/越剧)台词精准转写

Qwen3-ASR-1.7B惊艳效果:戏曲唱段(京剧/越剧)台词精准转写 你听过AI识别流行歌曲,但你见过AI听懂京剧唱腔吗?传统戏曲的转写,尤其是那些带着独特唱腔、方言和复杂背景音乐的唱段,一直是语音识别…...

智能电脑排班系统V2024|全自动、高自由度、零门槛排班工具

温馨提示:文末有联系方式产品定位:新一代智能电脑排班系统 扩展版智能排班软件(2024最新稳定版)是一款专为中小团队设计的桌面级自动化排班解决方案。 它融合AI逻辑引擎与人性化交互,兼顾智能调度与人工干预自由度&…...

Qwen3-Reranker-4B实战教程:Qwen3-Reranker-4B在智能法务合同审查中的条款关联重排

Qwen3-Reranker-4B实战教程:Qwen3-Reranker-4B在智能法务合同审查中的条款关联重排 1. 引言 你有没有遇到过这样的情况?一份几十页的合同摆在面前,你需要快速找到所有与“违约责任”相关的条款,但它们在文档里散落各处&#xff…...

关于入手微磁学仿真软件Mumax3的若干问题及解决方案(第一部分)

一.背景及下载 1.什么是MuMax3? MuMax3 是一款基于 GPU 加速的开源微磁学模拟软件,由比利时根特大学开发。它利用有限差分法求解 Landau-Lifshitz-Gilbert (LLG) 方程,凭借 CUDA 核心的并行计算能力,其模拟速度比传统基于 CPU 的…...

零基础玩转GLM-OCR:单卡4090一键部署,纯文本/公式/表格全能解析

零基础玩转GLM-OCR:单卡4090一键部署,纯文本/公式/表格全能解析 1. 工具概览:你的全能文档解析助手 想象一下,你手头有一堆扫描的PDF、照片或截图,里面有重要文字、复杂公式和结构化表格。传统OCR工具要么识别不准&a…...

SUNFLOWER MATCH LAB硬件对接:基于STM32F103C8T6最小系统板的图像采集端设计

SUNFLOWER MATCH LAB硬件对接:基于STM32F103C8T6最小系统板的图像采集端设计 最近在做一个植物生长监测的项目,需要部署一批低成本的图像采集终端。核心需求很简单:定时给植物拍照,然后把照片传到云端服务器。听起来不难&#xf…...

同样是硅做的圆片,价差百倍的秘密:半导体与光伏晶圆的本质区别

如果你留意过半导体和光伏行业的产品价格,一定会有这样的疑问:同样是硅材质、尺寸相近的晶圆,高端半导体晶圆一片能卖到几千元,而光伏硅片却只要几十元,身价相差近百倍。明明都是“硅做的圆片”,为何命运如此不同? 其实答案很简单:它们看似同宗同源,实则从一开始就被…...

OpenClaw环境迁移指南:千问3.5-9B配置备份与恢复

OpenClaw环境迁移指南:千问3.5-9B配置备份与恢复 1. 为什么需要环境迁移? 上周我的主力开发机突然硬盘故障,导致OpenClaw的整套配置丢失。重新搭建环境时,光是飞书通道的授权验证就花了2小时,更别提那些精心调试的自…...

GPEN完整操作流程:从HTTP链接访问到结果保存

GPEN完整操作流程:从HTTP链接访问到结果保存 1. 引言:你的数字美容刀 你有没有翻出过一张老照片,里面的人脸模糊得只剩下轮廓?或者,用AI生成了一张很棒的图,偏偏人脸部分崩坏了?又或者&#x…...

# 系列文3:前后端彻底解耦!统一入参解析,前端只发JSON,后端随意

系列文3:前后端彻底解耦!统一入参解析,前端只发JSON,后端随意 非科班野生程序员,深耕政务信息化20年,这套自研Java Web框架支撑过省级新农保、全国跨省医保结算等核心民生系统,18年稳定运行至今…...

Swoole 5.0适配踩坑实录,深度解析协程生命周期变更、内存管理新规与RPC协议不兼容问题

第一章:Swoole 5.0升级适配全景概览Swoole 5.0 是一次面向现代化 PHP 协程生态的重大演进,彻底移除对传统同步阻塞 API 的兼容包袱,全面拥抱协程原生化设计。其核心变化涵盖事件循环重构、协程调度器强化、HTTP/Server 接口标准化&#xff0c…...

VSCode下载与配置Starry Night Art Gallery开发环境

VSCode下载与配置Starry Night Art Gallery开发环境 如果你对“Starry Night Art Gallery”这个项目感兴趣,想动手参与开发或者自己搭建一个类似的数字艺术画廊,那么第一步就是准备好趁手的开发工具。Visual Studio Code(简称VSCode&#xf…...

手把手教你用Phi-4-mini-reasoning搭建智能解题助手:从部署到实战

手把手教你用Phi-4-mini-reasoning搭建智能解题助手:从部署到实战 1. 项目背景与价值 数学解题一直是学习和教学中的关键环节,但传统方式存在效率低下、资源有限等问题。Phi-4-mini-reasoning作为专为推理任务优化的轻量级模型,为解决这些问…...

第六章:异步访问的同步:6.3.1 dma_resv_usage 层级机制详解

1. 概述 dma_resv(DMA reservation object)是 Linux 内核中管理 GPU buffer 同步的核心机制。每个 dma_resv 对象维护一组 dma_fence,用于追踪对该 buffer 的各种操作。 enum dma_resv_usage 定义了 fence 的用途级别,控制"谁…...

C语言调用MiniCPM-V-2_6推理引擎:高性能嵌入式AI接口开发指南

C语言调用MiniCPM-V-2_6推理引擎:高性能嵌入式AI接口开发指南 如果你是一名C语言开发者,或者正在为嵌入式设备寻找一个既强大又高效的视觉语言模型,那么你来对地方了。今天我们要聊的,是如何用最纯粹的C语言,去直接调…...

YOLOv12官版镜像实战:手把手教你验证COCO数据集,小白也能轻松上手

YOLOv12官版镜像实战:手把手教你验证COCO数据集,小白也能轻松上手 1. 环境准备与快速部署 1.1 镜像环境概览 YOLOv12官版镜像已经预装了所有必要的运行环境,开箱即用。主要配置包括: Python 3.11环境PyTorch 2.5深度学习框架C…...

【THM-题目答案】:Privilege Escalation-Linux Privilege Escalation-Privilege Escalation:PATH

1. 你有写权限的文件夹是什么? What is the odd folder you have write access for?/home/murdoch【思路】:find / -writable 2>/dev/null | cut -d "/" -f 2,3 | grep -v proc | sort -u2. 利用$PATH漏洞读取flag6.txt文件的内容。 Explo…...

ACE-Step应用场景解析:如何为视频快速生成背景音乐?

ACE-Step应用场景解析:如何为视频快速生成背景音乐? 1. 引言:视频创作者的背景音乐痛点 在视频创作过程中,背景音乐的选择往往成为最耗时的环节之一。专业音乐授权费用高昂,免费音乐库又难以找到完全匹配的内容&…...

华为OD机试真题 新系统2026-04-01 C++实现【空间占用计算】

目录 题目 思路 Code 题目 员工A的磁盘空间经常被耗尽,他需要找到占用空间最大的目录或文件,然后决定如何清理文件释放空间。给定某一目录,请编写程序帮助他统计该目录内一级子目录和文件的占用空间,并返回目标目录一级子项(文件或子目录)中占用空间最大的项。 规则说明…...

IndexTTS2 V23问题排查:端口冲突、模型下载慢?常见问题一键解决

IndexTTS2 V23问题排查:端口冲突、模型下载慢?常见问题一键解决 1. 快速入门:IndexTTS2 V23简介 IndexTTS2 V23是由开发者"科哥"推出的最新开源文本转语音(TTS)系统,相比前代版本,它在情感控制和语音自然度…...

Qwen3-14B-Int4-AWQ实战:利用VLOOKUP函数思想实现跨数据源信息智能关联

Qwen3-14B-Int4-AWQ实战:利用VLOOKUP函数思想实现跨数据源信息智能关联 1. 引言:当Excel遇到大数据 "小王,帮我把这两个表格的数据匹配一下。"这样的需求在数据分析工作中再常见不过了。在Excel里,我们通常会使用VLOO…...

数据库安全与运维管控(二):从“共享账号”到本地账密泄露分析

在日常的研发联调和生产排障中,开发人员不可避免地需要连接数据库来核对数据或验证逻辑。目前绝大多数企业的做法依然是:DBA 在底层数据库中执行 GRANT 命令,创建一个只读账号(如 dev_readonly),然后将 IP …...

基于影墨·今颜的Java面试题智能生成与解析系统

基于影墨今颜的Java面试题智能生成与解析系统 面试,对于技术人来说,既是展示能力的舞台,也是一场需要精心准备的“考试”。无论是面试官绞尽脑汁设计能考察真实水平的题目,还是求职者海量刷题却不得要领,传统的面试准…...

Janus-Pro-7B集成Dify实战:构建企业级AI应用工作流

Janus-Pro-7B集成Dify实战:构建企业级AI应用工作流 最近和几个做企业服务的朋友聊天,他们都在头疼一件事:公司里各种业务场景都想用上AI,比如自动审核用户上传的图片、根据商品图生成营销文案,但真要动手做&#xff0…...

大模型学习第8天--python基础(数据结构:列表字典元组)

2026.04.08周二第四部分数据结构:列表list 字典dict 元组tuple 已看完 还剩集合set明天看#列表——增 # stu [] #空列表 # stu ["小明", 18, True, "boys"] # teacher [张老师, 赵老师, 徐老师] # school [teacher, stu, 工作人员, 100] …...

nanobot惊艳效果展示:用‘生成一份Python爬虫获取CSDN文章标题’指令执行结果

nanobot惊艳效果展示:用‘生成一份Python爬虫获取CSDN文章标题’指令执行结果 今天,我想和大家分享一个让我眼前一亮的AI助手体验。最近,我在一个预置了nanobot的镜像环境中,尝试了一个非常具体的指令:“生成一份Pyth…...