Linux C柔性数组(零长数组)

        零长数组,大小为0,一般用在结构体中(网络通信,省流),节省空间,方便善后(相对于指针类型),我们通过具体例子进行理解。

常规定长数组

#include <stdio.h>
#include <string.h>
#include <stdlib.h>#define CUR_LEN 512
#define MAX_LEN 1024typedef struct
{int len;char data[MAX_LEN];
}St_FixedSize;int main()
{St_FixedSize *fixed_size = NULL;//数组大小printf("the size of St_FixedSize:%d\n", sizeof(St_FixedSize));//申请空间并赋值if((fixed_size = (St_FixedSize *)malloc(sizeof(St_FixedSize))) != NULL){fixed_size->len = CUR_LEN;memcpy(fixed_size->data, "Hello World", CUR_LEN);printf("%d, %s\n", fixed_size->len, fixed_size->data);}//销毁free(fixed_size);fixed_size = NULL;return 0;
}

执行结果:

此结构体大小 = sizeof(int) + sizeof(char*MAX_LEN) = 4 + 1024 = 1028,但是data我们只使用了12个字节,浪费了1024 - 12 = 1012个字节的空间,缺点暴露无遗,优点是只申请了一次内存空间。

常规指针数组

#include <stdio.h>
#include <string.h>
#include <stdlib.h>#define CUR_LEN 512
#define MAX_LEN 1024typedef struct
{int len;char *data;
}St_PointSize;int main()
{St_PointSize *point_size = NULL;//结构体大小printf("the size of St_PointSize:%d\n", sizeof(St_PointSize));//申请空间并赋值if((point_size = (St_PointSize *)malloc(sizeof(St_PointSize))) != NULL){point_size->len = CUR_LEN;point_size->data = (char *)malloc(CUR_LEN);if(point_size->data != NULL){memcpy(point_size->data, "Hello World", CUR_LEN);printf("%d, %s\n", point_size->len, point_size->data);}}//销毁if(point_size->data){free(point_size->data);}free(point_size);point_size = NULL;return 0;
}

执行结果为:

此结构体大小 = sizeof(int) + sizeof(不同平台不同编译器下的指针大小) = 16,空间的确节省了,但是在申请和释放的阶段都进行了两次,比较麻烦,容易引起内存泄漏问题。

柔性数组

#include <stdio.h>
#include <string.h>
#include <stdlib.h>#define CUR_LEN 512
#define MAX_LEN 1024typedef struct
{int len;char data[0];
}St_OSize;int main()
{St_OSize *Osize = NULL;//结构体大小printf("the size of St_PointSize:%d\n", sizeof(St_OSize));//申请空间并赋值if((Osize = (St_OSize *)malloc(sizeof(St_OSize) + CUR_LEN)) != NULL){Osize->len = CUR_LEN;memcpy(Osize->data, "Hello World", CUR_LEN);printf("%d, %s\n", Osize->len, Osize->data);}//销毁free(Osize);Osize = NULL;return 0;
}

执行结果:

结构体大小只有成员变量int len的大小,而data变量不占空间(char data[0]不同于指针),优点很明显,只申请了一次空间,也只释放了一次空间,同时也满足了节省空间的需求,另外这个结构体的空间还是连续的(大家可以打印下相应字段的地址)。

但是,柔性数组只能被>=C90的编译器支持(char data[]写法被C99支持)且并不没有被包含近C/C++的标准之中(GNU C中是允许的)。大家根据实际需要灵活使用吧。

参考

C语言0长度数组之《可变数组/柔性数组》详解 - 知乎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/802453.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】深入解析机器学习基础

在本篇深入探讨中&#xff0c;我们将揭开机器学习背后的基础原理&#xff0c;这不仅包括其数学框架&#xff0c;更涵盖了从实际应用到理论探索的全方位视角。机器学习作为数据科学的重要分支&#xff0c;其力量来源于算法的能力&#xff0c;这些算法能够从数据中学习并做出预测…

CentOS下部署ftp服务

要在linux部署ftp服务首先需要安装vsftpd服务 yum install vsftpd -y 安装完成后需要启动vsftpd服务 systemctl start vsftpd 为了能够访问ftp的端口&#xff0c;需要在防火墙中开启ftp的端口21&#xff0c;否则在使用ftp连接的时候会报错No route to host. 执行如下命令为f…

纯纯python实现梯度下降、随机梯度下降

最近面试有要求手撕SGD&#xff0c;这里顺便就把梯度下降、随机梯度下降、批次梯度下降给写出来了 有几个注意点&#xff1a; 1.求梯度时注意label[i]和pred[i]不要搞反&#xff0c;否则会导致模型发散 2.如果跑了几千个epoch&#xff0c;还是没有收敛&#xff0c;可能是学习率…

基于逻辑回归和支持向量机的前馈网络进行乳腺癌组织病理学图像分类

CNN&#xff08;卷积神经网络&#xff09;通过使用反向传播方法来学习特征&#xff0c;这种方法需要大量的训练数据&#xff0c;并且存在梯度消失问题&#xff0c;从而恶化了特征学习。 CNN卷积神经网络 CNN由一个多层神经网络组成&#xff0c;该网络从标记的训练数据集中学习…

计算机视觉入门 详细教程实例

计算机视觉是人工智能领域的一个重要分支&#xff0c;涉及使用计算机来理解和解释图像和视频内容。以下是一个计算机视觉入门的详细教程实例&#xff0c;包括基本概念、常用技术和示例代码&#xff1a; 1. 理解计算机视觉的基本概念 介绍计算机视觉的定义和应用领域。解释图像…

ScreenToGif录制屏幕保存为gif

录制屏幕操作转成gif保存很实用&#xff0c;适合录制场景还原 https://www.screentogif.com/ Releases NickeManarin/ScreenToGif GitHub

C#WPF给控件增加滚动条

本文实例演示C#WPF中给控件增加滚动条。 XAML代码如下: <Windowx:Class="PageDemo.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="…

HarmonyOS实战开发-使用OpenGL实现2D图形绘制和动画。

介绍 基于XComponent组件调用Native API来创建EGL/GLES环境&#xff0c;从而使用标准OpenGL ES进行图形渲染。本项目实现了两个示例&#xff1a; 使用OpenGL实现2D的图形绘制和动画&#xff1b;使用OpenGL实现了在主页面绘制两个立方体&#xff0c;光源可以在当前场景中移动&…

LeetCode 2009.使数组连续的最少操作数:去重排序 + 滑动窗口

【LetMeFly】2009.使数组连续的最少操作数&#xff1a;去重排序 滑动窗口 力扣题目链接&#xff1a;https://leetcode.cn/problems/minimum-number-of-operations-to-make-array-continuous/ 给你一个整数数组 nums 。每一次操作中&#xff0c;你可以将 nums 中 任意 一个元…

从高频到低频:全面解析压控振荡器结构与应用场景

压控振荡器&#xff08;简称VCO&#xff09;是一种电子电路&#xff0c;其特点是输出的振荡频率能够随着输入电压的变化而连续改变。在VCO中&#xff0c;通过调控输入端的电压信号&#xff0c;可以相应地改变内部谐振电路的参数&#xff08;如电感、电容或者变容二极管的电容值…

【智能算法】人工电场算法(AEFA)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献 1.背景 2019年&#xff0c;A Yadav等人受库伦定律和运动定律启发&#xff0c;提出了人工电场算法&#xff08;Artificial Electric Field Algorithm&#xff0c;AEFA&#xff09;。 2.算法原理 2.1算法思…

【Spring Cloud】服务容错中间件Sentinel入门

文章目录 什么是 SentinelSentinel 具有以下特征&#xff1a;Sentinel分为两个部分: 安装 Sentinel 控制台下载jar包&#xff0c;解压到文件夹启动控制台访问了解控制台的使用原理 微服务集成 Sentinel添加依赖增加配置测试用例编写启动程序 实现接口限流总结 欢迎来到阿Q社区 …

如何在项目中使用uni-ui组件库

1、安装uni-ui npm i dcloudio/uni-ui 2、组件自动引用 配置easycom 使用 npm 安装好 uni-ui 之后&#xff0c;需要配置 easycom 规则&#xff0c;让 npm 安装的组件支持 easycom 打开项目根目录下的 pages.json 并添加 easycom 节点&#xff1a; // pages.json {"e…

maya节点绕轴旋转

目录 旋转后并尝试冻结变换 绕x轴旋转90度 使用Python脚本 使用图形界面 使用MEL脚本 绕y轴旋转90度 使用Python脚本 ok 旋转后并尝试冻结变换 import maya.cmds as cmdsdef adjust_root_rotation_for_export(joint_name):# 选择根节点cmds.select(joint_name)# 应用旋…

HTML转EXE工具(HTML App Build)永久免费版:24.4.9.0

最新版本的HTML2EXE即将发布了。自从去年发布了HTML2EXE之后&#xff0c;我就正式上班了&#xff0c;一直忙于工作&#xff0c;实在没有时间更新&#xff08;上班时间不能做&#xff09;&#xff0c;很多网友下载使用&#xff0c;反应很好&#xff0c;提出了一些改进的建议&…

【2023】LeetCode HOT 100——二叉树

目录 1. 二叉树的中序遍历1.1 C++实现1.2 Python实现1.3 时空分析2. 二叉树的最大深度2.1 C++实现2.2 Python实现2.3 时空分析3. 翻转二叉树3.1 C++实现3.2 Python实现3.3 时空分析4. 对称二叉树4.1 C++实现

【代码随想录】day39

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、62.不同路径二、63. 不同路径 II 一、62.不同路径 class Solution { public:int uniquePaths(int m, int n) {vector<vector<int>> path;path.res…

感知定位篇之机器人感知定位元件概述(上)

欢迎关注微信公众号 “四足机器人研习社”&#xff0c;本公众号的文章和资料和四足机器人相关&#xff0c;包括行业的经典教材、行业资料手册&#xff0c;同时会涉及到职业知识学习及思考、行业发展、学习方法等一些方面的文章。 目录 |0.概述 |1.常用传感元件 1.1视觉传感器…

C语言什么是外部函数?怎么⽤?

一、问题 什么是外部函数呢&#xff1f;怎么使⽤&#xff1f; 二、解答 外部函数在整个源程序中都有效&#xff0c;其定义的⼀般形式如下。 extern 类型声明符 函数名(形参表); 例如&#xff1a; extern int f(int a,int b); 调⽤外部函数时&#xff0c;需要对其进⾏声明。…

医疗器械常见法规和标准

在医疗器械行业找工作&#xff0c;有些JD上会明确要求熟悉相关的医疗器械法规和标准&#xff0c;比如&#xff1a;ISO13485、NMPA、CE、IEC62304、IEC60601、IEC14971等等&#xff0c;根据这些我来简单总结下&#xff1a; ISO 13485&#xff08;医疗器械质量管理体系&#xff0…