内存管理--柔性数组

本次讲的是,柔性数组,如果哪位小博客想要了解的更多,可以登录下面这个网站,了解详细内容

C语言结构体里的成员数组和指针 | 酷 壳 - CoolShellicon-default.png?t=N7T8https://coolshell.cn/articles/11377.html

  • 我们就听说过数组,听说过柔性数组吗?柔性数组建立在结构体中,最后一个成员(是数组)并且没有指定大小。这就叫:柔性数组。它的标准代码为:
    //柔性数组
    
    struct S
    {
    	char c;
    	int a;
    	int arr[];//柔性数组没有指定大小
    };

    这个就是柔性数组的基本表达。

  • 柔性数组的特点:1.结构中的柔性数组成员前⾯必须⾄少⼀个其他成员。

                                    2.sizeof返回的这种结构⼤⼩不包括柔性数组的内存。

                                   3.包含柔性数组成员的结构⽤malloc()函数进⾏内存的动态分配,并且分配                                           的内存应该⼤于结构的⼤⼩,以适应柔性数组的预期⼤⼩。

它的代码为:

//柔性数组的特点
struct S
{
	int a;
	int arr[];
};
int main()
{
	printf("%zd\n", sizeof(struct S));
	return 0;
}

打印的数字是4,这就说明,柔性数组不包含它自己本身的大小,而是它前一个数的大小。

  • 柔性数组的使用:我们先直接上代码,然后在分析,则代码为:
    //柔性数组的使用
    struct S
    {
    	int a;
    	int arr[];
    };
    int main()
    
    {
    	struct S* ps = (struct S*)malloc(sizeof(struct S) + 5 * sizeof(int));
    	if (ps == NULL)
    	{
    		perror("malloc");
    		return 1;
    	}
    	ps->a = 100;
    	int i = 0;
    	for (i = 0; i < 5; i++)
    	{
    		ps->arr[i] = i;
    	}
    	//调整空间
    	struct S* ptr = (struct S*)realloc(ps,sizeof(struct S) + 10 * sizeof(int));
    	if (ptr != NULL)
    	{
    		ps = ptr;
    	}
    
    	//释放
    	free(ps);
    	ps = NULL;
    	return 0;
    }
    

    对于这第一种代码,就是把内存放在堆上,还有第二种代码,我们来比较一下,看看哪种代码更容易被接受,则代码二为:

    #include <stdio.h>
    #include <stdlib.h>
    typedef struct st_type
    {
    	int i;
    	int* p_a;
    }type_a;
    int main()
    {
    	type_a* p = (type_a*)malloc(sizeof(type_a));
    	p->i = 100;
    	p->p_a = (int*)malloc(p->i * sizeof(int));
    
    	//业务处理 
    	for (i = 0; i < 100; i++)
    	{
    		p->p_a[i] = i;
    	}
    
    	//释放空间 
    	free(p->p_a);
    	p->p_a = NULL;
    	free(p);
    	p = NULL;
    	return 0;
    }

    你们说这两种代码,哪一个更好?

其实,两种代码,都有各自的好处,各有各的特点,首先第一个,它释放内存快,方便释放内存

第二个,方便访问内存的速度,各有各的千秋吧,

我们不去讨论哪一个更好,而是要看,它们各自的优点。你们认为呢?

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Excel求解二元一次方程

背景&#xff1a;如果想求解二元一次方程&#xff0c;常规方法就是联立方程求出一个未知数&#xff0c;然后带入任意一个等式。那么在excel里面应该怎么解决呢&#xff1f; 总所周知&#xff0c;大学里面会学矩阵行列式&#xff0c;二元一次方程其实就是一个简单的矩阵行列式。…

006 高并发内存池_PageCache设计

​&#x1f308;个人主页&#xff1a;Fan_558 &#x1f525; 系列专栏&#xff1a;高并发内存池 &#x1f339;关注我&#x1f4aa;&#x1f3fb;带你学更多知识 文章目录 前言文章重点一、回顾PageCache页缓存结构二、PageCache结构设计三、完善申请内存函数小结 前言 本文将…

聊一聊电子邮件?

电子邮件是什么&#xff1f; 电子邮件是一种基于客户/服务器架构的应用。功能是实现人与人之间的交流。直到现在&#xff0c;电子邮件依然是当前因特网 注意&#xff1a;基于客户/服务器方式和基于B/S架构不一样&#xff01;客户/服务器表示的范围更广&#xff0c;当基于客户…

Linux环境jdk、git、maven、MySQL和redis的安装和配置

这里整理了在Linux上如何安装和配置jdk、git、maven、MySQL和redis&#xff0c;主要用于在Linux上部署Java项目 文章中博主使用了一个叫FinalShell远程连接软件进行上传&#xff0c;如果没有类似的工具也可以直接通过yum命令行下载包 博主使用的Linux服务器为centos7&#xf…

2024最新版Android studio安装入门教程(非常详细)

目录 JDK安装与配置 一、下载JDK 二、JDK安装 三、JDK的环境配置 四、JDK的配置验证 Android studio安装 Android studio连接手机真机调试&#xff08;以华为鸿蒙为例&#xff09; 一、新建一个android项目 二、进入项目面板 三、配置Android Studio 四、安装手机驱…

【JavaSE】初识线程,线程与进程的区别

文章目录 ✍线程是什么&#xff1f;✍线程和进程的区别✍线程的创建1.继承 Thread 类2.实现Runnable接口3.匿名内部类4.匿名内部类创建 Runnable ⼦类对象5.lambda 表达式创建 Runnable ⼦类对象 ✍线程是什么&#xff1f; ⼀个线程就是⼀个 “执行流”. 每个线程之间都可以按…

BigInteger的应用

这里写目录标题 例题BigInteger常用方法关于BigInteger初始化为nullcompareTo()方法 : 返回一个int型数据(1 大于; 0 等于 ; -1 小于) 例题 import java.math.BigInteger; import java.util.*; public class Main{public static void main(String[] args) {BigInteger n BigIn…

android 消息提醒

1.创建 MyBackgroundService.java 继承 Service public class MyBackgroundService extends Service {Overridepublic void onCreate() {super.onCreate();Log.i("业务服务", "开起业务服务");//调用服务后在页面手机上创建一个通知消息。if (android.os…

TS的基础

TS Typed JavaScript at Any Scale. 它强调了 TypeScript 的两个最重要的特性——类型系统、适用于任何规模。 我们知道&#xff0c;JavaScript 是一门非常灵活的编程语言&#xff0c; 它没有类型约束&#xff0c;一个变量可能初始化时是字符串&#xff0c;过一会儿又被赋值为…

如何用 C++ 在 10 行内写出八皇后?

在编程世界中&#xff0c;有时挑战在于以最简洁的方式表达复杂的逻辑。八皇后问题就是这样一道经典难题&#xff0c;它要求在88的棋盘上放置8个皇后&#xff0c;使得任意两个皇后之间都不能位于同一行、同一列或同一斜线上。虽然这个问题可以通过多种算法解决&#xff0c;包括递…

Scala介绍与环境搭建

Scala环境搭建与介绍 一、Scala环境搭建 1、环境准备与下载 2、验证Scala 3、IDEA新建项目&#xff0c;配置Scala&#xff0c;运行Hello world 二、Scala介绍 1、Scala 简介 2、Scala 概述 一、Scala环境搭建 1、环境准备与下载 JDK1.8 Java Downloads | Oracle 下载需求版本…

代码随想录|Day29|贪心04|860.柠檬水找零、406.根据身高重建队列、452.用最少数量的箭引爆气球

860.柠檬水找零 我们维护三种金额的数量&#xff1a;five&#xff0c;ten&#xff0c;twenty 有如下三种情况&#xff1a; 账单是5&#xff1a;five 1&#xff0c;无需找零账单是10&#xff1a;ten 1&#xff0c;找零一张5元&#xff08;five - 1&#xff09;账单是20&#x…

Eclipse EMF教程(上)

What every Eclipse developer should know about EMF 翻译自&#xff1a;https://eclipsesource.com/blogs/tutorials/emf-tutorial/ 本教程是对EMF的介绍&#xff0c;解释了EMF的基础知识。我们首先向您展示如何基于EMF构建一个非常简单的以数据为中心的应用程序&#xff0c…

MES_ENT_STD

生产执行系统&#xff08;企业标准版&#xff09;MES_ENT_STD ERP_ENT_STD_59438.ieqq.ent-CSDN博客 OAMS_ENT_STD-CSDN博客

分类预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积长短期记忆网络多输入分类预测

分类预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积长短期记忆网络多输入分类预测 目录 分类预测 | MATLAB实现BO-CNN-LSTM贝叶斯优化卷积长短期记忆网络多输入分类预测效果一览基本介绍模型搭建程序设计参考资料 效果一览 基本介绍 MATLAB实现BO-CNN-LSTM贝叶斯优化卷积长短期记…

主干网络篇 | 利用RT-DETR模型主干HGNet去替换YOLOv8的主干

前言:Hello大家好,我是小哥谈。众所周知,实时目标检测(Real-Time Object Detection)一直被YOLO系列检测器统治着,YOLO版本更是炒到了v9,前段时间百度飞桨的PaddleDetection团队发布了一个名为RT-DETR的检测器,宣告其推翻了YOLO对实时检测领域统治。论文标题很直接:《D…

WPF上使用MaterialDesign框架---下载与配置

一、介绍&#xff1a; Material Design语言的一些重要功能包括 系统字体Roboto的升级版本 &#xff0c;同时颜色更鲜艳&#xff0c;动画效果更突出。杜拉特还简要谈到了新框架的一些变化。谷歌的想法是让谷歌平台上的开发者掌握这个新框架&#xff0c;从而让所有应用就有统一的…

Python 常用内置库 time库、random库、turtle库

文章目录 一、time库二、random库三、turtle库1. 绘制正方形2. 使用海龟对象绘制六边形3. 绘制多个起点相同大小不同起点的五角星4. 绘制多个图形和添加文字 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、time库 time是最基础的时间处理库&#…

CAJViewer7.3 下载地址及安装教程

CAJViewer是中国学术期刊&#xff08;CAJ&#xff09;全文数据库的专用阅读软件。CAJViewer是中国知识资源总库&#xff08;CNKI&#xff09;开发的一款软件&#xff0c;旨在方便用户在线阅读和下载CAJ数据库中的学术论文、期刊和会议论文等文献资源。 CAJViewer具有直观的界面…

Kubernetes之Projected Volume

目录 四种Projected Volume Secret 使用方法 应用场景 示例 ConfigMap 使用方法 应用场景 示例 Downward API 使用方法 应用场景 示例 ServiceAccountToken 使用方法 应用场景 示例 在 Kubernetes 中,有几类特殊的 Volume,它们存在的意义不是为了存放容器里的…