C语言高阶【2】--动态内存管理【2】--柔性数组(这是个全新的知识点,不想了解一下吗?)

news2024/11/28 16:48:23

本章概述

  • 柔性数组
  • 总结C/C++中程序内存划分
  • 彩蛋时刻!!!!

柔性数组

数组这个东西,我想大家应该都不陌生了吧。但是,柔性数组这个东西可能你是第一次听说。

  • 柔性数组概念:在C99之前是没这个东西的,在C99之后就有这个东西了在C99中规定,结构体中的最后一个成员是大小未知的数组,那么这个数组就叫做柔性数组。进行结构展示:
struct st_type
{
	  int i;
      int a[0];      //柔性数组成员 ,0就代表没有元素
};
// 有些编译器还可以这样写
struct st_type
{
	  int i;
      int a[];      //柔性数组成员 
};
  • 柔性数组的特点
    • 1 .结构体是有大小的,由于我们的柔性数组大小是未知的。所以,在柔性数组之前,必须至少有一个知道大小的成员
    • 2.我们计算含有柔性数组的结构体的大小时,所计算的大小不包含柔性数组,因为它大小未知。进行代码展示:
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <stdlib.h>
struct stu
{
	int i;
	int arr[];
};
int main()
{
	printf("%d\n",sizeof(struct stu));
	return 0;
}

结果运行图:在这里插入图片描述

  • 柔性数组的使用柔性数组的使用要和动态内存函数一起使用我们一般用malloc进行空间的开辟。我们为这个含有柔性数组的结构体,开辟空间的大小至少为其它成员的大小。 进行代码展示:
#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <stdlib.h>
struct stu
{
	int i;
	int arr[];
};
int main()
{
	struct stu* p = (struct stu*)malloc(8*sizeof(int));    //前4个字节给inti,
	                                                       //后4个字节给int arr[]
	if (p == NULL)
		return 1;
	p->i = 100;
	printf("%d\n",p->i);
	int i = 0;
	for (i = 0; i < 4; i++)
	{
		p->arr[i] = i;
	}
	for (i = 0; i < 4; i++)
	{
		printf("%d ",p->arr[i]);
	}
	free(p);
	p = NULL;
	return 0;
}

结果运行图:在这里插入图片描述
我们还可以模拟柔性数组,达到同样的效果,进行代码展示:

#define  _CRT_SECURE_NO_WARNINGS	1
#include <stdio.h>
#include <stdlib.h>
struct stu
{
	int i;
	int*p;
};
int main()
{
	struct stu* pp = (struct stu*)malloc(sizeof(struct stu));
	pp->p = malloc(4*sizeof(int));
	int i = 0;
	for (i = 0; i < 4; i++)
	{
		*((pp->p)+i) = i;
	}
	for (i = 0; i < 4; i++)
	{
		printf("%d ", *((pp->p) + i));
	}
	free(pp->p);
	free(pp);
	pp->p = NULL;
	pp = NULL;
	return 0;
}

结果运行图:在这里插入图片描述
这个模拟的代码要注意我们最后释放两次空间,第一次是p的空间,第二次是pp的空间,一定要先释放p,再释放pp。因为p是在pp之后才创建的空间,pp是p的爸爸,你要是把pp释放了,p就没有了,就无法释放p的空间了。如图所示:在这里插入图片描述

  • 柔性数组的优点
    • 1.方便我们释放内存,我们直接开辟好空间后,就会返回这个空间的地址,我们释放空间的时候,就可以直接通过这个地址直接释放。但是,如果按照我们的模拟代码的话,就需要释放两次,而且还要考虑释放顺序,这就很不方便。
    • 2.能够提升一定的运行效率。我们直接用柔性数组开辟出来的空间是连续的。但是,我们模拟的代码开辟的空间,里面存在内存碎片。我们为结构体开辟了一块空间,里面还为int i 和int*p都各自开辟了一块空间,而在它们之间还有空白的(多余)内存空间没用到,就出现了内存碎片。如图所示:在这里插入图片描述
      我们在这个结构体里面创建的成员比较少,内存碎片显示的不是很明显。但是,当我们创建的较多时,内存碎片就会显示的比较明显。

总结C/C++中程序内存划分

关于内存的划分以及各个部分存储什么数据,我们都已经讲过了。今天就给大家展示一下它们的对应关系,如图:在这里插入图片描述
对于内核空间,是操作系统操作的,我们程序员是无法进行访问的。为什么栈区和堆区会有向下和向上的箭头呢?其实,栈区和堆区的空间大小是灵活调整的。栈区多一点,堆区就少一点。反过来,堆区多一点,栈区就少一点。无论怎么变化,栈区和堆区的总和不变。 咱们以前讲过,静态区里面存放的是全局变量和常量。其实,划分细点就是分为数据段和代码段。数据段存放的全局变量和静态数据(static修饰的数据),代码段存放的是常量和编译后可执行的二进制代码。

彩蛋时刻!!!!

PLAY歌曲:《Shots》在这里插入图片描述
每章一句一鸣从此始,相望青云端。感谢你能看到这里,点赞+关注+收藏+转发是对我最大的鼓励,咱们下期见!!!

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

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

相关文章

基于Flux的文生高清图片

Flux模型生成的图片画质极佳&#xff0c;改进修复了手的问题&#xff0c;支持字体生成和排版&#xff0c;训练参数大&#xff0c;风格多样&#xff0c;分辨率弹性好&#xff0c;embedding通用性好&#xff0c;不需要输入负面提示词。 安装ComfyUI ComfyUI下载安装 下载和配置…

计算机网络:计算机网络概述 —— 网络拓扑结构

文章目录 网络拓扑总线型拓扑特点缺陷 星型拓扑特点缺陷 环型拓扑特点缺陷 网状型拓扑优点缺陷 树型拓扑特点缺陷 网络拓扑 网络拓扑指的是计算机网络中节点&#xff08;计算机、交换机、路由器等&#xff09;之间物理或逻辑连接的结构。网络拓扑定义了节点之间的布局、连接方…

方法重载(Overload)

前言 在前面的学习中&#xff0c;我们学到了重写(Override),这里我们主要进行重载(Overload)的介绍&#xff0c;同时对重写和重载的区别进行分析。 1. 重载(Overload) #方法重载 在同一个类中定义多个同名但参数不同的方法。我们称方法与方法之间构成方法重载 在Java中&…

【宽搜】1. 层序遍历模板讲解

题目描述 题目链接&#xff1a;N叉树的层序遍历 层序遍历流程 请仔细阅读下图&#xff1a; 根据上图的流程&#xff0c;下面再明确几个问题&#xff1a; 1. 为什么要使用队列&#xff1f; 队列是先进先出的数据结构&#xff0c;在数的层序遍历中&#xff0c;需要先将节点p…

Pikachu-Sql Inject-宽字节注入

基本概念 宽字节是相对于ascII这样单字节而言的&#xff1b;像 GB2312、GBK、GB18030、BIG5、Shift_JIS 等这些都是常说的宽字节&#xff0c;实际上只有两字节 GBK 是一种多字符的编码&#xff0c;通常来说&#xff0c;一个 gbk 编码汉字&#xff0c;占用2个字节。一个…

【C++打怪之路Lv6】-- 内存管理

&#x1f308; 个人主页&#xff1a;白子寰 &#x1f525; 分类专栏&#xff1a;C打怪之路&#xff0c;python从入门到精通&#xff0c;数据结构&#xff0c;C语言&#xff0c;C语言题集&#x1f448; 希望得到您的订阅和支持~ &#x1f4a1; 坚持创作博文(平均质量分82)&#…

软考鸭微信小程序:助力软考备考的便捷工具

一、软考鸭微信小程序的功能 “软考鸭”微信小程序是一款针对软考考生的备考辅助工具&#xff0c;提供了丰富的备考资源和功能&#xff0c;帮助考生提高备考效率&#xff0c;顺利通过考试。其主要功能包括&#xff1a; 历年试题库&#xff1a;小程序内集成了历年软考试题&…

PyTorch实现卷积神经网络CNN

一、卷积神经网络CNN 二、代码实现&#xff08;PyTorch&#xff09; 1. 导入依赖库 import torch from torch import nn, optim from torchvision import datasets, transforms from torch.utils.data import DataLoader nn&#xff1a;包含了torch已经准备好的层&#xff0c…

Pikachu-Unsafe Fileupload-服务端check

MIME MIME是Multipurpose Internet Mail Extensions &#xff08;多用途互联网邮件扩展类型&#xff09;的缩写&#xff0c;用来表示文件、文档、或字节流的性质和格式。是设定某种扩展名的文件用一种应用程序来打开的方式类型&#xff0c;当该扩展名文件被访问的时候&#xff…

论文阅读笔记-A Comparative Study on Transformer vs RNN in Speech Applications

前言 介绍 序列到序列模型已广泛用于端到端语音处理中,例如自动语音识别(ASR),语音翻译(ST)和文本到语音(TTS)。本文着重介绍把Transformer应用在语音领域上并与RNN进行对比。与传统的基于RNN的模型相比,将Transformer应用于语音的主要困难之一是,它需要更复杂的配…

【hot100-java】【分割回文串】

回溯篇 class Solution {//ret是需要返回的结果//path是回溯过程中的记录private final List<List<String>> retnew ArrayList<>();private final List<String> path new ArrayList<>();private String s;public List<List<String>>…

建筑资质的未来发展趋势

&#x1f3d7;️建筑资质是建筑企业进入市场的通行证&#xff0c;它不仅关系到企业的竞争力&#xff0c;也影响着整个建筑行业的健康发展。随着政策的调整和技术的进步&#xff0c;建筑资质管理正面临着新的变革。 1. 资质管理的数字化转型&#xff1a;&#x1f310; 随着信息技…

JavaScript-上篇

JS 入门 JS概述 JavaScript&#xff08;简称JS&#xff09;是一种高层次、解释型的编程语言&#xff0c;最初由布兰登艾奇&#xff08;Brendan Eich&#xff09;于1995年创建&#xff0c;并首次出现在网景浏览器中。JS的设计初衷是为Web页面提供动态交互功能&#xff…

区块链可投会议CCF C--CT-RSA 2025 截止10.15 附2024录用率

Conference&#xff1a;The Cryptographers Track at RSA Conference (CT-RSA) CCF level&#xff1a;CCF C Categories&#xff1a;network and information security Year&#xff1a;2025 Conference time&#xff1a;San Francisco, California, USA • April 28–May …

930/105每日一题

算法 1 4,2,9,11, 4, 2,4 2,4,9 42 4 24 9 2&#xff08;0&#xff09; 4&#xff08;1&#xff09; 9&#xff08;2&#xff09; 11&#xff08;3&#xff09; 11&#xff08;0&#xff09;11&#xff08;1&#xff09; 9&#xff08;2&#xff09; 11&#xff08;3&#xf…

深度学习:基于MindSpore实现CycleGAN壁画修复

关于CycleGAN的基础知识可参考&#xff1a; 深度学习&#xff1a;CycleGAN图像风格迁移转换-CSDN博客 以及MindSpore官方的教学视频&#xff1a; CycleGAN图像风格迁移转换_哔哩哔哩_bilibili 本案例将基于CycleGAN实现破损草图到线稿图的转换 数据集 本案例使用的数据集里…

Qt系统学习篇(6)-QMainWindow

QMainWindow是一个为用户提供主窗口程序的类&#xff0c;包含一个菜单栏(menu bar)、多个工具栏(tool bars)、多个锚接部件(dock widgets)、一个状态栏(status bar)及一个中心部件(central widget)&#xff0c;是许多应用程序的基础&#xff0c;如文本编辑器&#xff0c;图片编…

webpack信息泄露

先看看webpack中文网给出的解释 webpack 是一个模块打包器。它的主要目标是将 JavaScript 文件打包在一起,打包后的文件用于在浏览器中使用,但它也能够胜任转换、打包或包裹任何资源。 如果未正确配置&#xff0c;会生成一个.map文件&#xff0c;它包含了原始JavaScript代码的映…

算法笔记(九)——栈

文章目录 删除字符串中的所有相邻重复项比较含退格的字符串基本计算机II字符串解码验证栈序列 栈是一种先进后出的数据结构&#xff0c;其操作主要有 进栈、压栈&#xff08;Push&#xff09; 出栈&#xff08;Pop&#xff09; 常见的使用栈的算法题 中缀转后缀逆波兰表达式求…

关注、取关、Redis实现共同关注、 博客推送与分页查询

Resourceprivate StringRedisTemplate stringRedisTemplate;Resourceprivate IUserService userService;Overridepublic Result follow(Long followUserId, Boolean isFollow) {//1.获取登陆的用户Long userId UserHolder.getUser().getId();//1.判断是关注还是取关if(isFollo…