内存管理--柔性数组

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

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;
    }

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

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

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

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

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

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

相关文章

游戏本笔记本更换@添加内存条实操示例@DDR5内存条

文章目录 添加内存条的意义准备工具设备拔出电源适配器并关机&#x1f47a;样机 内存条上的金手指安装过程Notes 安装后开机初次开机速度屏幕显示分辨率和闪烁问题检查安装后的效果 添加内存条的意义 参考双通道内存DDR5多通道内存-CSDN博客 准备工具 准备一个质量差不多的螺…

向量点乘有哪些作用呢

如下&#xff1a; 1.找到两个向量之间的夹角(不用多说) 2.求一个向量投影在另一个向量的投影&#xff1a; 我们把图中b的在a上的投影向量称作b1吧&#xff0c;因为b1就在a上&#xff0c;所以只需要求出b1的大小&#xff0c;然后乘以a的单位向量&#xff0c;我们就得到向量b1了…

Rust常用特型之Clone+Copy特型

Rust常用特型之CloneCopy特型。在Rust标准库中&#xff0c;存在很多常用的工具类特型&#xff0c;它们能帮助我们写出更具有Rust风格的代码。 今天&#xff0c;我们把Clone 和 Copy 特型放在一起学习。 &#xff08;注&#xff1a;本文更多的是对《Programing Rust 2nd Editio…

类加载过程详解

1、加载 通过类的全名&#xff0c;获取类的二进制数据流。解析类的二进制数据流为方法区内的数据结构&#xff08;Java类模型&#xff09; 创建java.lang.Class类的实例&#xff0c;表示该类型。作为方法区这个类的各种数据的访问入口 2、验证 验证类是否符合JVM规范&…

Altair® Embed® 嵌入式系统的可视化环境

Altair Embed 嵌入式系统的可视化环境 Altair Embed 是一款成熟的工具&#xff0c;可从框图模型自动生成代码并将其传输到通用控制器硬件来开发嵌入式系统。 基于系统关系图创建工作仿真后&#xff0c;用户即可对硬件控制器自动生成相关代码&#xff0c;并通过硬件在环 (HIL)…

ubuntu 安装配置samba服务器完整教程

ubuntu 安装配置samba服务器完整教程 问题描述解决方法郑重声明:本人原创博文,都是实战,均经过实际项目验证出货的 转载请标明出处:攻城狮2015 Platform: Intel arm64 OS:ubuntu16.04 问题描述 在安卓驱动系统开发的过程中,会需要打架服务器,又需要搭建samba服务器,下面就…

【BlossomConfig】SpringCloud项目是如何对bootstrap配置文件进行加载的?

文章目录 bootstrap配置文件的读取 网关项目源码 RPC项目源码 配置中心项目源码 bootstrap配置文件的读取 我们首先来了解一下springboot是如何做配置管理的。 了解了springboot对配置文件的管理&#xff0c;我们就能知道为什么springcloud类型的项目要使用bootstrap配置文件了…

美国RAKsmart:裸机云站群服务器配置详解

裸机云&#xff0c;也称为物理云&#xff0c;是一种云服务模式&#xff0c;它为用户提供了接近物理机性能的云服务器。而站群服务器&#xff0c;则是为了支持多个网站或应用程序的运行而设计的服务器。美国RAKsmart作为一家知名的云服务提供商&#xff0c;其裸机云站群服务器配…

【大模型】大模型发展历程,从GPT开始到Grok-1.5霸榜

目录 大模型发展历程 大模型发展历程 2018年6月&#xff0c;openAI发布GPT1&#xff1b;2019年2月&#xff0c;发布GPT2&#xff1b;2020年6月&#xff0c;发布GPT-3。 2022年11月30日&#xff0c;openAI发布ChatGPT。 2023年3月14日&#xff0c;GPT-4 发布。 2023年7月18日…

Proteus 12V to 5V buck电路仿真练习及遇到的一些问题汇总

基础电路仿真实验记录贴&#xff01;&#xff01;&#xff01;如有写的不对的地方欢迎交流指正&#xff01;&#xff01;&#xff01; 平台&#xff1a;PC win10 软件&#xff1a;Proteus8.10 仿真目标&#xff1a;buck降压电路&#xff08;PWM控制输出电压&#xff09; 写在…

八皇后问题解决过程字符串可视化

查找到问题&#xff0c;暂停600毫秒&#xff0c; 穷举本行&#xff0c;200毫秒 返回上一层之前&#xff0c;会弹出回滚上一层&#xff08;4&#xff0c;X&#xff09;&#xff0c;并暂停600毫秒 成功返回时&#xff0c;会弹出上一层具体数据如&#xff08;4&#xff0c;3&a…

Java | Leetcode Java题解之第3题无重复字符的最长子串

题目&#xff1a; 题解&#xff1a; class Solution {public int lengthOfLongestSubstring(String s) {// 哈希集合&#xff0c;记录每个字符是否出现过Set<Character> occ new HashSet<Character>();int n s.length();// 右指针&#xff0c;初始值为 -1&#…

分治——归并排序算法

例题一 解法&#xff08;归并排序&#xff09;&#xff1a; 算法思路&#xff1a; 归并排序的流程充分的体现了「分⽽治之」的思想&#xff0c;⼤体过程分为两步&#xff1a; ◦ 分&#xff1a;将数组⼀分为⼆为两部分&#xff0c;⼀直分解到数组的⻓度为 1 &#xff0c;使…

【MySQL】DQL-分组查询-语法&where与having的区别&注意事项&可cv例题语句

前言 大家好吖&#xff0c;欢迎来到 YY 滴MySQL系列 &#xff0c;热烈欢迎&#xff01; 本章主要内容面向接触过C Linux的老铁 主要内容含&#xff1a; 欢迎订阅 YY滴C专栏&#xff01;更多干货持续更新&#xff01;以下是传送门&#xff01; YY的《C》专栏YY的《C11》专栏YY的…

【Web应用技术基础】CSS(6)——使用 HTML/CSS 实现 Educoder 顶部导航栏

第一题&#xff1a;使用flex布局实现Educoder顶部导航栏容器布局 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Educoder</title><script src"https://cdn.staticfile.org/jquery/1.1…

EDM营销文案的撰写技巧?如何提升转化率?

EDM营销文案与SEO策略如何结合&#xff1f;怎么写有效营销邮件&#xff1f; EDM仍然是一种高效且经济的推广手段。撰写优质的EDM营销文案&#xff0c;不仅可以提升品牌形象&#xff0c;还能有效促进销售转化。那么&#xff0c;如何撰写出引人入胜的EDM营销文案呢&#xff1f;A…

Anaconda conda常用命令

查看配置信息&#xff1a;conda config --show 恢复默认源&#xff1a;conda config --remove-key channels 创建虚拟环境&#xff1a;conda create -n env_name python3.8&#xff0c;表示创建python版本为3.8、名字为env_name的虚拟环境。 查看虚拟环境&#xff1a;conda …

Python点云处理(二十二)基于XGBoost的点云分类算法

目录 0 简述1 XGBoost2 点云特征向量构建3 用XGBoost进行分类4 代码实现5 结果展示0 简述 点云分类是计算机视觉领域中的一个重要任务,其主要目标是将三维空间中的点云数据划分为不同的类别。点云是由大量的三维点组成的数据集,通常由激光雷达或结构光等传感器采集而来。点云…

KNN算法 | K近邻:KD Tree、球树、KNN数据下采样策略

目录 一. KNN算法实现方式1. 蛮力实现(brute)2. KD树(kd_tree)3. 球树(ball_tree) 二. KD Tree算法1. 构建方式2. KD Tree 查找最近邻 三. 球树(Ball Tree)1. 构建方式 四. KNN评价1. 优点2. 缺点 五. 延申1. KNN数据下采样策略策略1策略2策略3策略4 Condensed Nearest Neighbo…

Leo赠书活动-23期 【Python数据分析】文末送书

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; 赠书活动专栏 ✨特色专栏&#xff1a;…