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

news2024/11/26 10:47:23

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

常规定长数组

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define CUR_LEN 512
#define MAX_LEN 1024

typedef 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 1024

typedef 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 1024

typedef 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.coloradmin.cn/o/1590998.html

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

相关文章

[温故] 红黑树算法

前言 最近在突然想起一些基础的东西, 向着温故知新, 有了些新的感悟和大家分享一下. 排序算法是数据结构的一个重要组成部分, 当时学习的时候没有少折腾, 这里来看看大佬们怎么运用这些数据结构来构建庞大的计算机体系的. 二叉树是排序算法的一个衍生, 基于二叉树的构建不同…

【路径规划】基于六次多项式的多关节机器人避障路径规划

最近迷上了机械臂避障轨迹规划&#xff0c;因为之前一直做的都是无障碍物轨迹规划&#xff0c;所以这次想试一下有障碍物的&#xff0c;把避障算法用在我的SimMechanics机械臂上&#xff0c;看看效果咋样。以下定义不区分路径规划和轨迹规划。   by the way&#xff0c;本文实…

一种跳板机的实现思路

一、 跳板机思路简介 本文所描述的跳板机&#xff08;下文称为“jmp”&#xff09;支持&#xff1a; Linux服务器 Windows服务器 其他终端&#xff08;MySQL终端、Redis终端、网络设备终端 等等&#xff09; 有别于市面上常见的jumpserver方案&#xff0c;使用本文所搭建的跳…

CSS实现卡片在鼠标悬停时突出效果

在CSS中&#xff0c;实现卡片在鼠标悬停时突出&#xff0c;通常使用:hover伪类选择器。 :hover伪类选择器用于指定当鼠标指针悬停在某个元素上时&#xff0c;该元素的状态变化。通过:hover选择器&#xff0c;你可以定义鼠标悬停在元素上时元素的样式&#xff0c;比如改变颜色、…

最新PDD批发Anti-Content参数逆向分析与算法还原

文章目录 1. 写在前面2. 接口分析3. 分析与扣代码 【&#x1f3e0;作者主页】&#xff1a;吴秋霖 【&#x1f4bc;作者介绍】&#xff1a;擅长爬虫与JS加密逆向分析&#xff01;Python领域优质创作者、CSDN博客专家、阿里云博客专家、华为云享专家。一路走来长期坚守并致力于Py…

Java(今天偷懒一丢丢

今天学了一点点io流 基本概念 输入流&#xff08;InputStream&#xff09;&#xff1a;用于从数据源读取数据。输出流&#xff08;OutputStream&#xff09;&#xff1a;用于向目标写入数据。 分类 按功能分类 字节流&#xff1a;处理字节数据&#xff0c;如 InputStream 和…

CSS aspect-ratio属性设置元素宽高比

aspect-ratio 是CSS的一个属性&#xff0c;用于设置元素的期望宽高比。它设置确保元素保持特定的比例&#xff0c;不受其内容或容器大小的影响。 语法&#xff1a; aspect-ratio: <ratio>;其中 <ratio> 是一个由斜杠&#xff08;/&#xff09;分隔的两个数字&…

韩顺平 | 零基础快速学Python(12) OOP基础

面向对象编程-基础 类与对象 类提供了把数据和功能绑定在一起的方法。创建新类时创建了新的对象类型&#xff0c;从而能够创建该类型的新实例/对象。 类时抽象的概念&#xff0c;作为数据类型代表一类事物&#xff1b;对象时具体实际的&#xff0c;作为实例代表具体事物&…

【c语言】atoi函数---使用和模拟实现(详解)

atoi函数---使用和模拟实现 atoi函数在Cplusplus中的定义 atoi函数的使用 #include <stdio.h> #include <stdlib.h>int main() {char arr[20] "4831213";int ret 0;ret atoi(arr);printf("arr:%s\n", arr);printf("ret:%d\n", re…

JWT重放漏洞如何攻防?你的系统安全吗?

大家好&#xff0c;我是石头~ 在数字化浪潮席卷全球的今天&#xff0c;JSON Web Token&#xff08;JWT&#xff09;作为身份验证的利器&#xff0c;已成为众多Web应用的首选方案。 然而&#xff0c;正如硬币有两面&#xff0c;JWT的强大功能背后也隐藏着潜在的安全风险&#xf…

手把手教你如何下载学浪上的视频课程

学浪直播课程下载技术尚未攻克&#xff0c;但视频课程下载却易如反掌。 1.首先解压好我给大家准备好的压缩包 学浪下载器链接&#xff1a;https://pan.baidu.com/s/1y7vcqILToULrYApxfEzj_Q?pwdkqvj 提取码&#xff1a;kqvj --来自百度网盘超级会员V10的分享 2.首先解压我…

OpenHarmony编译构建系统

这篇来聊聊OpenHarmony的编译构建&#xff0c;经过前面的实践&#xff0c;再来看编译构建。 编译构建概述 在官网中提到了&#xff0c;OpenHarmony编译子系统是以GN和Ninja构建为基座&#xff0c;对构建和配置粒度进行部件化抽象、对内建模块进行功能增强、对业务模块进行功能…

数据采集仪:自动化监测系统的核心组件

在当代的工业自动化领域&#xff0c;数据采集仪成为了一个关键的技术工具&#xff0c;它不仅仅是简单地将电信号转化为数据信号&#xff0c;而是能够实时、有效地处理和显示各种信号&#xff0c;确保整个监测系统的稳定、高效运行。 点击输入图片描述&#xff08;最多30字&…

计算机网络 子网掩码与划分子网

一、实验要求与内容 1、需拓扑图和两个主机的IP配置截图。 2、设置网络A内的主机IP地址为“192.168.班内学号.2”&#xff0c;子网掩码为“255.255.255.128”&#xff0c;网关为“192.168.班内学号.1”&#xff1b;设置网络B内的主机IP地址为“192.168.班内学号100.2”&#…

JWT详解及实战教程

目录 1.什么是JWT 2.JWT能做什么 3.为什么是JWT 基于传统的Session认证 基于JWT认证 4.JWT的结构是什么? 5.使用JWT 6.封装工具类 7.整合springboot 1.什么是JWT JSON Web Token (JWT) is an open standard (RFC 7519) that defines a compact and self-contained way…

CSS-浮动文字环绕布局、隐藏属性display、overflow、三角形制作、鼠标样式

文字环绕布局 CSS文字环绕布局是指在网页中让文字环绕在图片或其他元素周围的布局方式。这通常通过CSS中的float属性来实现。你可以将图片设置为float: left;或float: right;&#xff0c;然后在文本元素中使用clear属性来清除浮动&#xff0c;以确保文字不会覆盖图片。另外&am…

python爬虫-------urllib代理和代理池(第十七天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

介绍一个方便的python包和环境管理软件Anaconda,如何快速安装

为什么要安装Ananconda&#xff1f; Anaconda是一个方便的python包管理和环境管理软件&#xff0c;一般用来配置不同的项目环境。它通过管理工具包、开发环境、Python版本&#xff0c;大大简化了工作流程。不仅可以方便地安装、更新、卸载工具包&#xff0c;而且安装时能自动安…

SpringBoot 微服务token 传递实现

1、前言 随着微服务的流行&#xff0c;微服务之间的安全以及业务需要&#xff0c;都需要穿递token &#xff0c;而token的传递一般通过header 头来传递。从架构的角度来讲 &#xff0c;一般的企业应用都由nginx、业务网关和各个微服务组成。这个nginx 传递header 我就不讲述。下…

伪装目标检测论文阅读之:《Confidence-Aware Learning for Camouflaged Object Detection》

论文地址&#xff1a;link code:link 摘要&#xff1a;   任意不确定性捕获了观测结果中的噪声。对于伪装目标检测&#xff0c;由于伪装前景和背景的外观相似&#xff0c;很难获得高精度的注释&#xff0c;特别是目标边界周围的注释。我们认为直接使用“嘈杂”的伪装图进行训…