【C语言】柔性数组

news/2024/10/25 7:28:20/

柔性数组

  • 1. 柔性数组介绍
  • 2. 柔性数组特点
  • 3. 用例
    • 3.1 代码一:
    • 3.2 代码二:
  • 4. 柔性数组优势:

1. 柔性数组介绍

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

C99 中,结构中的最后一个元素允许是未知大小的数组,这就叫做『柔性数组』成员。

例如:零长度数组概念

struct S
{int n;char c;int arr[];//柔性数组成员
};

有些编译器无法编译,可以改成:

struct S
{int n;char c;int arr[0];//柔性数组成员
};

2. 柔性数组特点

  • 结构中的柔性数组成员前面必须至少一个其他成员。

  • sizeof 返回的这种结构大小不包括柔性数组的内存。

  • 包含柔性数组成员的结构用malloc ()函数进行内存的动态分配,并且分配的内存应该大于结构的大小,
    以适应柔性数组的预期大小。

3. 用例

3.1 代码一:

在这里插入图片描述

//代码一:
struct S
{int n;char c;int arr[];
};
int main()
{struct S* ps = (struct S*)malloc(sizeof(struct S) + 10 * sizeof(int));//设置int arr数组元素为10个,10*sizeof(int)if (ps == NULL){printf("%s\n", strerror(errno));return 1;}ps->n = 100;ps->c = 'w';for (int i = 0;i < 10;i++){ps->arr[i] = i;}for (int i = 0;i < 10;i++){printf("%d\n", ps->arr[i]);}free(ps);ps = NULL;
}

3.2 代码二:

在这里插入图片描述

//代码二:
struct S
{int n;char c;int* arr;
};int main()
{struct S* ps = (struct S*)malloc(sizeof(struct S));if (ps == NULL){perror("malloc");return 1;}int*ptr = (int*)malloc(10 * sizeof(int));//设置int arr数组元素为10个,10*sizeof(int)if (ptr == NULL){perror("malloc2");return 1;}else{ps->arr = ptr;}//使用ps->n = 100;ps->c = 'w';int i = 0;for (i = 0; i < 10; i++){ps->arr[i] = i;}//打印for (i = 0; i < 10; i++){printf("%d ", ps->arr[i]);}//扩容 - 调整arr的大小ptr = realloc(ps->arr, 20 * sizeof(int));//增容int arr数组元素为20个,10*sizeof(int)if (ptr == NULL){perror("realloc");return 1;}else{ps->arr = ptr;}//使用ps->n = 100;ps->c = 'w';for (i = 0; i < 20; i++){ps->arr[i] = i;}//打印for (i = 0; i < 20; i++){printf("%d ", ps->arr[i]);}//释放free(ps->arr);ps->arr = NULL;free(ps);ps = NULL;return 0;
}

4. 柔性数组优势:

代码一和代码二都可以完成相同功能,但代码一有以下两个好处:

第一个好处是:方便内存释放。

如果我们的代码是在一个给别人用的函数中,你在里面做了二次内存分配,并把整个结构体返回给用户。

用户调用free可以释放结构体,但是用户并不知道这个结构体内的成员也需要free,所以你不能指望用户来发现这个事。

所以,如果我们把结构体的内存以及其成员要的内存一次性分配好了,并返回给用户一个结构体指针,用户做一次free就可以把所有的内存也给释放掉。
在这里插入图片描述

第二个好处是:这样有利于访问速度。

连续的内存有益于提高访问速度,也有益于减少内存碎片。

(其实,我个人觉得也没多高了,反正 你跑不了要用做偏移量的加法来寻址)

补充:局部性原理:

  • 局部性原理是计算机科学中的一种基本原理,指的是程序中的指令和数据在执行时会集中在较小的一部分存储器中,并且在短时间内重复使用。这种局部性表现在两个方面:时间局部性和空间局部性。

  • 时间局部性指的是,某个数据或指令一旦被使用,在短时间内会被多次使用。例如,在循环结构的程序中,循环体内的指令会被反复执行。

  • 空间局部性指的是,某个数据或指令的使用会对其周围的数据与指令产生影响,这些数据和指令也会在短时间内被多次使用。例如,在数组操作中,相邻的元素都会被频繁地访问。

  • 局部性原理的应用可以提高计算机系统的性能,例如通过缓存技术和虚拟内存技术,让系统可以快速地访问常用的数据和代码,从而减少了额外的访问时间和存储开销。

👊👊👊
感谢阅读!


http://www.ppmy.cn/news/34949.html

相关文章

【数据结构】用栈实现队列

&#x1f4af;&#x1f4af;&#x1f4af; 本篇总结利用栈如何实现队列的相关操作&#xff0c;不难观察&#xff0c;栈和队列是可以相互转化的&#xff0c;需要好好总结它们的特性&#xff0c;构造出一个恰当的结构来实现即可&#xff0c;所以本篇难点不在代码思维&#xff0c;…

Django 实现瀑布流

需求分析 现在是 "图片为王"的时代&#xff0c;在浏览一些网站时&#xff0c;经常会看到类似于这种满屏都是图片。图片大小不一&#xff0c;却按空间排列&#xff0c;就这是瀑布流布局。 以瀑布流形式布局&#xff0c;从数据库中取出图片每次取出等量&#xff08;7 …

ConvMixer:Patches Are All You Need

Patches Are All You Need 发表时间&#xff1a;[Submitted on 24 Jan 2022]&#xff1b; 发表期刊/会议&#xff1a;Computer Vision and Pattern Recognition&#xff1b; 论文地址&#xff1a;https://arxiv.org/abs/2201.09792&#xff1b; 代码地址&#xff1a;https:…

dwf镜像安装

dns配置 curl -fsSL https:``//get.docker.com | bash -s docker --mirror Aliyun curl: (6) Could not resolve host: get.docker.com; Unknown error 这个错误通常是由于 DNS 无法解析主机名 get.docker.com 导致的。可能的原因包括网络故障、DNS 配置错误或防火墙设置等 Cen…

【栈和队列OJ题】有效的括号用队列实现栈用栈实现队列设计循环队列

​ ​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;数据结构 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录OJ题1.有效的括号1.1…

autovue进阶终极版-实现各种样子的在线预览

一、实现目的 之前jnlp方式存在很多限制&#xff0c;比如&#xff0c;客户端电脑必须安装jdk&#xff0c;还有每次都要下载那个jnlp文件&#xff0c;然后再点击&#xff0c;然后才能启动&#xff0c;过程麻烦且看着别捏。。。 二、实现效果 1.web版 浏览器地址栏输入&#x…

SQL优化13连问,收藏好!

1.日常工作中&#xff0c;你是怎么优化SQL的&#xff1f; 大家可以从这几个维度回答这个问题&#xff1a; 分析慢查询日志 使用explain查看执行计划 索引优化 深分页优化 避免全表扫描 避免返回不必要的数据&#xff08;如select具体字段而不是select*&#xff09; 使用…

将 XLS 转换为 EXE:xlCompiler Crack

只需单击几下即可将Excel文件转换为应用程序 xl编译器无需编程即可将您的Excel电子表格转换为软件应用程序 将 XLS 转换为 EXE 将Excel文件转换为具有保护选项的应用程序。Excel 到 EXE 转换器为您提供了分发 Excel 模型的竞争优势和灵活性。将 Excel 的功能丰富的环境保存在应…