你听说过柔性数组吗?

目录

1. 柔性数组的概念

2. 柔性数组的特点

3. 柔性数组的使用

4. 柔性数组的优势

 5.完结散花


 

                                            悟已往之不谏,知来者犹可追                                                        

创作不易,宝子们!如果这篇文章对你们有帮助的话,别忘了给个免费的赞哟~

1. 柔性数组的概念

也许你从来没有听说过柔性数组这个概念,但它确实是存在的。

C99中,结构体中的最后一个成员是允许未知大小的数组,这就叫做柔性数组成员!

typedef struct st_type
{int i;int a[0];//柔性数组成员
}type_a;

 有些编译器会报错无法编译可以改成~

typedef struct st_type
{int i;int a[];//柔性数组成员
}type_a;

 

2. 柔性数组的特点

1 .结构体中柔性数组前面必须至少含有一个其他成员~

2. sizeof计算的结构体大小不包含柔性数组的大小~

struct s
{int i;int a[];
};
int main()
{printf("%zd\n", sizeof(struct s));return  0;
}

 

3. 包含柔性数组的结构体用malloc函数进行内存的动态分配,并且分配的内存必须大于结构体的内存,以适应柔性数组的预期大小~

4. 一个结构体中只能含有一个柔性数组

3. 柔性数组的使用

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
struct s
{int i;int a[];
};
int main()
{//printf("%zd\n", sizeof(struct s));struct s* p = (struct s*)malloc(sizeof(struct s) + 40);assert(p);//判断指针的有效性p->i = 100;for (int i = 0; i < 10; i++){p->a[i] = i + 1;}for (int i = 0; i < 10; i++){printf("%d ", p->a[i]);}free(p);p = NULL;return  0;
}

malloc在堆上是这样开辟空间的~

4. 柔性数组的优势

4.1上述功能的实现也可以用如下代码实现~

struct S
{int i;int* arr;
};int main()
{struct S* pa = (struct S*)malloc(sizeof(struct S));assert(pa);//判断指针的有效性pa->i = 100;pa->arr = (int*)malloc(40);assert(pa->arr);for (int i = 0; i < 10; i++){pa->arr[i] = i + 1;}for (int i = 0; i < 10; i++){printf("%d ", pa->arr[i]);}free(pa->arr);//释放空间pa->arr = NULL;free(pa);pa = NULL;return 0;
}

 以上代码在堆上是这样开辟空间的~

 

 上面俩段代码可以实现同样的功能~

4.2但使用柔性数组却有俩个好处~

其一:方便内存释放

如果我们的代码是在一个给别人用的函数中,你在里面做了⼆次内存分配,并把整个结构体返回给用户。用户调用free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以你不能指望用户来发现这个事。所以,如果我们把结构体的内存以及其成员要的内存⼀次性分配好了,并返回给用户⼀个结构体指针,用户做⼀次free就可以把所有的内存也给释放掉。
其二:这样有利于提高访问速度

连续的内存有利于提高访问速度,也有利于减少内存的碎片化。(其实,个人觉得也没有多高了,反正你跑不了要用偏移量的加法来寻址)

 

 5.完结散花

好了,这期的分享到这里就结束了~

如果这篇博客对你有帮助的话,可以用你们的小手指点一个免费的赞并收藏起来哟~

如果期待博主下期内容的话,可以点点关注,避免找不到我了呢~

我们下期不见不散~~

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

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

相关文章

Python列表:灵活多变的数据结构

文章目录 一、列表1.创建列表2.访问列表元素3.修改列表元素4.添加元素5.删除元素 二、列表脚本操作符1.连接运算符 2.重复运算符 * 三、列表函数&方法1.函数1.1 len() 函数1.2 max() 函数1.3 min() 函数1.4 sum() 函数1.5 list() 函数 2.方法2.1 append() 方法2.2 extend()…

《一本书讲透 Elasticsearch》荣登当当人工智能新书榜

年前&#xff0c;《一本书讲透 Elasticsearch》荣登京东编程语言与程序设计榜前5名&#xff0c;今天又上榜当当人工智能新书榜第7名。 先看评价&#xff0c;看看大家阅后反馈 来自百度公司员工评价 来自Elastic原厂资深架构师评价 来自IBM资深架构师周钰老师的评价 来自2位阿里…

高级语言期末2012级B卷

1.编写函数&#xff0c;输出任意正整数n的位数&#xff08;n默认为存储十进制的整形变量&#xff09; 例如&#xff1a;正整数13&#xff0c;则输出2,&#xff1b;正整数3088&#xff0c;则输出4 #include <stdio.h>int func(int n) {int count0;while(n>0) {n/10;co…

unity学习(38)——创建(create)角色脚本(panel)--EventSystem

1.在scripts文件夹下创建一个脚本CreatePlayerPanel.cs&#xff0c;脚本挂到panel上&#xff01;给panel加个tag&#xff0c;叫createPanel&#xff0c;脚本内容如下&#xff1a; using System.Collections; using System.Collections.Generic; using TMPro; using UnityEngin…

【2024软件测试面试必会技能】Appium自动化(6):原生app元素定位方法

元素定位方法介绍及应用&#xff1a; Appium方法定位原生app元素: 通过appium inspector工具&#xff0c;可以获取元素的相关信息&#xff1b;在appium中提供了一系列的元素定位API&#xff0c;通过在这些API中输入指定的元素信息&#xff0c;就能完成元素定位&#xff0c;定…

Linux设备模型(二) - kset/kobj/ktype APIs

一&#xff0c;kobject_init_and_add 1&#xff0c;kobject_init_and_add实现 /** * kobject_init_and_add() - Initialize a kobject structure and add it to * the kobject hierarchy. * kobj: pointer to the kobject to initialize * ktype: p…

Vue3 + Ts (使用lodash)

安装 npm i --save lodash使用 import _ from lodash⚠️报警告&#xff1a;&#xff01;&#xff01;&#xff01; 此时还需要安装ts声明文件库 npm install types/lodash -D安装之后重启Vscode还是会提示上面的警告&#xff0c;此时还需在tsconfig.ts里面配置 {"c…

【力扣 - 搜索插入位置】

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 题解1 int searchInsert(int* nums, int numsSize, in…

harbor(docker仓库)仓库部署 - 高可用

harbor&#xff08;docker仓库&#xff09;仓库部署 - 高可用 1. harbor高可用1.1 方案说明1. 双主复制2. 多harbor实例共享后端存储 1.2 部署高可用&#xff08;多harbor实例共享后端存储&#xff09;1. 服务器划分2. 安装harbor&#xff08;先部署一套Harbor&#xff0c;用于…

Python代码实现2024年刘谦春晚魔术

import randomdef main():# 扑克牌随机抽取4张牌playingCards [A, 2, 3, 4, 5, 6, 7, 8, 9, 10, J, Q, K]cardTackA []for i in range(4):k random.choice(playingCards)cardTackA.append(k)# 将抽取的4张牌随机打乱cnt 0while cnt < 100:random.shuffle(cardTackA)cnt …

企业级人脸美颜和美妆解决方案

视觉营销日益重要&#xff0c;而人脸美颜和美妆作为视觉营销的关键环节&#xff0c;更是受到了众多企业的关注。美摄科技&#xff0c;作为国内领先的人脸美颜和美妆解决方案提供商&#xff0c;以其先进的技术和卓越的产品&#xff0c;助力企业打造完美视觉体验&#xff0c;提升…

快速学习安全框架 Springsecurity最新版(6.2)--用户授权模块

简介 上一节Springsecurity 用户认证 Springsecurity 拥有强大的认证和授权功能并且非常灵活&#xff0c;,一来说我们都i有以下需求 可以帮助应用程序实现以下两种常见的授权需求&#xff1a; 用户-权限-资源&#xff1a;例如张三的权限是添加用户、查看用户列表&#xff0c;李…