当包容结构体遇见灵活的内存管理

news2024/12/30 2:38:24

🌈个人主页:小田爱学编程
🔥 系列专栏:c语言从基础到进阶
🏆🏆关注博主,随时获取更多关于c语言的优质内容!🏆🏆


😀欢迎来到小田代码世界~
😁 喜欢的小伙伴记得一键三连哦 ૮(˶ᵔ ᵕ ᵔ˶)ა


目录

一.结构体

1.定义:

2.基本格式:

3 .结构体的声明

4.结构体的初始化 

5.结构体成员的访问

6.结构体传参和结构体传值

7.结构体的自引用

8.匿名结构体注意

9.内存对齐

10.位段

 二.动态内存管理

1.为什么要有动态内存管理

2.malloc函数

 3.free函数

 4.calloc函数

 5.relloc函数

三.柔性数组

1.定义

 2.举例

 3.注意

四.typedef关键字

 1.typedef关键字的使用格式:

2.举例:

五.联合体

1.定义

2.举例

3.联合体大小

六.枚举

1.定义

2.举例

3.运用

4.类比

5.对比


一.结构体

1.定义

C语⾔已经提供了内置类型,如:char、short、int、long、float、double等,但是只有这些内置类型还是不够的,假设我想描述学⽣,描述⼀本书,这时单⼀的内置类型是不⾏的。描述⼀个学⽣需要名字、年龄、学号、⾝⾼、体重等;描述⼀本书需要作者、出版社、定价等。C语⾔为了解决这个问题,增加了结构体这种⾃定义的数据类型,让程序员可以⾃⼰创造适合的类型。

2.基本格式:

struct tag
{
member-list;//成员变量的类型可以是:数组,结构体,指针
}variable-list;//变量列表

typedef struct Stu
{
char name[20];//名字
int age;//年龄
char sex[5];//性别
char id[20];//学号
}Stu;//分号不能丢

3 .结构体的声明

 🔥

struct Stu //类型声明
{
char name[15]; //名字
int age; //年龄
};

 🔥

struct Stu //类型声明
{
char name[15]; //名字
int age; //年龄
};

🔥

struct//省略掉了此处的tag标签
{
int a;
char b;
float c;
}x

4.结构体的初始化 

struct Stu s = { "张三", 20, "男", "20230818001" };
struct Stu s2 = { .age = 18, .name = "lisi", .id = "20230818002", .sex = "⼥};
struct Stu s3 = { .age = 18, .name = "lisi",  .sex = "女", "20230818002" };

5.结构体成员的访问

 🐟结构体成员的直接访问是通过点操作符(.)访问的

 🐟结构体成员的间接访问:结构体指针->成员名?

struct Point
{
int x;
int y;
};
int main()
{
struct Point p = {3, 4};
struct Point *ptr = &p;
print("%d\n",ptr->x);
print("%d\n",ptr->y);

 6.结构体传参和结构体传值

👨‍🌾函数传参的时候,参数是需要压栈的。
👨‍🌾如果传递一个结构体对象的时候,结构体过大,参数压栈的的系统开销比较大,所以会导致性       能的下降。

struct S
{
int data[1000];
int num;
};
struct S s = {{1,2,3,4}, 1000};
//结构体传参
void print1(struct S s)
{
printf("%d\n", s.num);
}
//结构体地址传参
void print2(struct S* ps)
{
printf("%d\n", ps->num);
}
int main()
{
print1(s);  //传结构体
print2(&s); //传地址
return 0;
}

7.结构体的自引用

struct Node
{
    int data;
    struct Node* next;
};

8.匿名结构体注意

🔥在使用匿名结构体时,只能使用一次,且两个结构体比较时已经失效

9.内存对齐

1.结构体的第⼀个成员对⻬到和结构体变量起始位置偏移量为0的地址处

2其他成员变量要对⻬到某个数字(对⻬数)的整数倍的地址处对⻬数=编译器默认的⼀个对⻬数与该成员变量⼤⼩的较⼩值(VS 中默认的值为 8 )

3.结构体总⼤⼩为最⼤对⻬数(结构体中每个成员变量都有⼀个对⻬数,所有对⻬数中最⼤的)的整数倍。

4.如果嵌套了结构体的情况,嵌套的结构体成员对⻬到⾃⼰的成员中最⼤对⻬数的整数处,结构体的整体⼤⼩就是所有最⼤对⻬数(含嵌套结构体中成员的对⻬数)的整数倍。

10.位段

 位段可以节省空间,从左到右开开辟内存

struct A
{
int _a:2;
int _b:5;
int _c:10;
int _d:30;
};

 二.动态内存管理

1.为什么要有动态内存管理

• 空间开辟⼤⼩是固定的。
• 数组在申明的时候,必须指定数组的⻓度,数组空间⼀旦确定了⼤⼩不能调整
但是对于空间的需求,不仅仅是上述的情况。有时候我们需要的空间⼤⼩在程序运⾏的时候才能知
道,那数组的编译时开辟空间的⽅式就不能满⾜了。
C语⾔引⼊了动态内存开辟,让程序员⾃⼰可以申请和释放空间,就⽐较灵活了

2.malloc函数

• 如果开辟成功,则返回⼀个指向开辟好空间的指针。
• 如果开辟失败,则返回⼀个 NULL 指针,因此malloc的返回值⼀定要做检查。
• 返回值的类型是 void* ,所以malloc函数并不知道开辟空间的类型,具体在使⽤的时候使⽤者⾃
⼰来决定。
• 如果参数 size 为0,malloc的⾏为是标准是未定义的,取决于编译器。

 3.free函数

🔥 这边free后没有重置成空指针,free后仍记录原来的地址,为啥free不起作用呢?

🔥因为free传递的是一个参数,函数传的只有参和值,这里传递了p一个参数,在函数中没有修改       作用,解决方法:置成空指针或传成p4的地址,我们通常选择前者

 4.calloc函数

• 函数的功能是为 num 个⼤⼩为 size 的元素开辟⼀块空间,并且把空间的每个字节初始化为0。?
• 与函数 malloc 的区别只在于 calloc 会在返回地址之前把申请的空间的每个字节初始化为全

#include <stdio.h>
#include <stdlib.h>
int main()
{
int *p = (int*)calloc(10, sizeof(int));
if(NULL != p)
{
int i = 0;
for(i=0; i<10; i++)
{
printf("%d ", *(p+i));
}
}
free(p);
p = NULL;
return 0;
}

 5.relloc函数

• realloc函数的出现让动态内存管理更加灵活。
• 有时会我们发现过去申请的空间太⼩了,有时候我们⼜会觉得申请的空间过⼤了,那为了合理的时候内存,我们⼀定会对内存的⼤⼩做灵活的调整。那 realloc 函数就可以做到对动态开辟内存⼤
⼩的调整。

 

🔥当是情况1的时候,要扩展内存就直接原有内存之后直接追加空间,原来空间的数据不发⽣变化

🔥在堆空间上另找⼀个合适⼤⼩的连续空间来使⽤。这样函数返回的是⼀个新的内存地址。

int*p = NULL;
p = realloc(ptr, 1000);
if(p != NULL)
{
ptr = p;
}

三.柔性数组

1.定义

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

2.举例

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

 3.注意

🔥结构中的柔性数组成员前⾯必须⾄少⼀个其他成员。
🔥 sizeof返回的这种结构⼤⼩不包括柔性数组的内存。

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

四.typedef关键字

 1. typedef关键字的使用格式:

 typedef  数据类型  新的名字;

2.举例:

typedef int  ListMember

  1. typedef struct Student {

  2. char name[100];

  3. int age;

  4. } STU;

五.联合体

1.定义

像结构体⼀样,联合体也是由⼀个或者多个成员构成,这些成员可以不同的类型。
但是编译器只为最⼤的成员分配⾜够的内存空间。联合体的特点是所有成员共⽤同⼀块内存空间。所以联合体也叫:共⽤体。
给联合体其中⼀个成员赋值,其他成员的值也跟着变化

2.举例

#include <stdio.h>
//联合类型的声明
union Un
{
char c;
int i;
};
int main()
{
//联合变量的定义
union Un un = {0};
//计算连个变量的⼤⼩
printf("%d\n", sizeof(un)
return 0;
}

3.联合体大小

• 联合的⼤⼩⾄少是最⼤成员的⼤⼩。
• 当最⼤成员⼤⼩不是最⼤对⻬数的整数倍的时候,就要对⻬到最⼤对⻬数的整数倍。

六.枚举

1.定义

枚举顾名思义就是⼀⼀列举,把可能的取值⼀⼀列举

2.举例

3.运用

#include <stdio.h>
 
enum DAY
{
      MON=1, TUE, WED, THU, FRI, SAT, SUN
};
 
int main()
{
    enum DAY day;
    day = MON;
    printf("%d",day);
    return 0;
}

4.类比

#define MON  1
#define TUE  2
#define WED  3
#define THU  4
#define FRI  5
#define SAT  6
#define SUN  7

5.对比

🥇🥇🥇  新的专栏:数据结构————"带你无脑刨析"博主正在火速创作中,可以关注博主一下   哦!φ(゜▽゜*)♪o(* ̄▽ ̄*)ブ[●´︶`●]

🎁🎁🎁今天的分享到这里就结束啦!如果觉得文章还不错的话,可以三连支持一下,您的支持就是我前进的动力!

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

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

相关文章

课时7:shell基础_shell简介

1.3.1 shell简介 学习目标 这一节&#xff0c;我们从 运维、shell语言、小结 三个方面来学习。 运维 简介 运维是什么&#xff1f;所谓的运维&#xff0c;其实就是公司的内部项目当中的一个技术岗位而已&#xff0c;它主要做的是项目的维护性工作。它所涉及的内容范围非常…

方法、数组

方法 是语句的集合&#xff0c;在一起执行一个功能 它是解决一类问题的步骤的有序集合 包含于类或对象中 在程序中创建&#xff0c;在其他地方被引用 设计方法的原则&#xff1a;方法的本意是功能块&#xff0c;就是实现某一个功能的语句块的集合。设计时&#xff0c;最好保持…

基于go mod模式创建项目最佳实践

希望能带给你成功的喜悦&#xff01; 除go get、vendor这两种方式外&#xff0c;Go版本在1.11之后推出了go module模式来管理依赖&#xff0c;使用go mod时下载的依赖文件在$GOPATH/pkg/mod/下。本文以两种办法介绍如何创建go mod项目。 目录 goland开启玩法 本地手动创建项目…

###C语言程序设计-----C语言学习(6)#

前言&#xff1a;感谢老铁的浏览&#xff0c;希望老铁可以一键三连加个关注&#xff0c;您的支持和鼓励是我前进的动力&#xff0c;后续会分享更多学习编程的内容。 一. 主干知识的学习 1. while语句 除了for语句以外&#xff0c;while语句也用于实现循环&#xff0c;而且它…

shell脚本自动化备份网络设备配置教程

由于局域网内存在多台网络设备&#xff0c;如防火墙、路由器、交换机等&#xff0c;数量众多&#xff0c;且品牌不同&#xff0c;手工备份配置需要相当长的时间&#xff0c;现需要实现自动化导出备份配置。 经查询&#xff0c;该局域网内存在华为及阿尔卡特两种品牌&#xff0…

Android Studio 下载安装配置使用入门【2024年最新】

前言&#xff1a; Android Studio 是谷歌官方提供的主要集成开发环境&#xff08;IDE&#xff09;&#xff0c;专为 Android 平台应用开发而设计。它基于 JetBrains 的 IntelliJ IDEA 软件&#xff0c;并在此基础上增加了大量针对 Android 开发的定制功能。Android Studio 通过…

CMake 完整入门教程(一)

1 前言 每一次学习新东西都是很有乐趣的&#xff0c;虽然刚开始会花费时间用来学习&#xff0c;但是实践证明&#xff0c;虽然学习新东西可能会花费一些时间&#xff0c;但是它们带来的好处会远远超过这些花费的时间。学习新东西是值得的&#xff0c;也是很有乐趣的。 网络上…

C语言二维数组的使用案列,来自C语言程序设计第五版本

感谢关注我的123个小伙伴&#xff0c;我会给大家带来更多的知识&#xff0c;但是C语言的学习&#xff0c;我准备今天学了这个月暂时停止更新了&#xff0c;下个月一号砸门又见面&#xff0c;休息两天弄其它的事情&#xff0c;也好几天没有看论文了。 二维数组的创建比较简单&am…

基于Python 爬虫的房地产数据可视化分析与实现

摘要&#xff1a; 过去&#xff0c;不管是翻阅书籍&#xff0c;还是通过手机&#xff0c;电脑等从互联网上手动点击搜索信息&#xff0c;视野受限&#xff0c;信息面太过于狭窄&#xff0c;且数据量大而杂乱&#xff0c;爆炸式信息的更新速度是快速且不定时的。要想手动获取到海…

算法沉淀——前缀和(leetcode真题剖析)

算法沉淀——前缀和 01.一维前缀和02.二维前缀和03.寻找数组的中心下标04.除自身以外数组的乘积05.和为 K 的子数组06.和可被 K 整除的子数组07.连续数组08.矩阵区域和 前缀和算法是一种用于高效计算数组或序列中某个范围内元素之和的技巧。它通过预先计算数组的前缀和&#xf…

Spring5深入浅出篇:Spring中的FactoryBean对象

Spring5深入浅出篇:Spring中的FactoryBean对象 Spring工厂创建简单对象 之前我们通过Spring配置文件创建的都是简单对象,那么什么是简单对象呢?简单对象就是通过new 构造方法 创建的对象,比如:UserService,User,Person等.那么我们就需要知道什么是复杂对象 什么是复杂对象 复…

防御保护笔记02

防火墙 防火墙的主要职责在于&#xff1a;控制和防护 ---- 安全策略 --- 防火墙可以根据安全策略来抓取流量 防火墙分类 按物理特性划分 软件防火墙 硬件防火墙 按性能划分 百兆级防火墙 吞吐量&#xff1a;指对网络、设备、端口、虚电路或其他设施&#xff0c;单位时间内成…

计算机网络——网络层(2)

计算机网络——网络层&#xff08;2&#xff09; 小程一言专栏链接: [link](http://t.csdnimg.cn/ZUTXU) 网络层——控制平面概述路由选择转发表路由协议路由信息的交换小结 路由选择算法常见的路由选择算法距离矢量路由算法工作原理优缺点分析 链路状态路由算法基本工作原理优…

【计网·湖科大·思科】实验五 IPV4地址-分类地址和构建超网

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的很重要&…

ZYNQ:CAN外设应用存在的问题

流程 为了用ZYNQ实现CAN总线功能&#xff0c;分为多个阶段&#xff1a; 1学习小梅哥视频&#xff0c;了解zynq简单工作搭建的流程&#xff0c;比如点亮LED。 GPIO 功能 按照小梅哥的视频搭建ZYNQ-PS应用系统时&#xff0c;vitis没有出现ps7_gpio_0这个硬件。这导致vitis软件…

深入了解DRAM和SDRAM:内存带宽的计算与封装形式的奥秘

SSD SDRAM DDR SDRAM简介 动态随机存取存储器DRAM&#xff08;Dynamic Random Access Memory&#xff0c;DRAM&#xff09;是一种半导体存储器。 其主要的作用原理是利用电荷内存储电荷的数量来代表一个二进制比特&#xff08;bit&#xff09;是1还是0。 由于在现实中品体管…

联想懂的通信×实在智能:共同探索智连融合AI创新发展路径

近日&#xff0c;联想集团副总裁/联想懂的通信CEO王帅、CFO周利军、COO&CPO邢海洋、CGO赵晨、CTO边毅等领导一行莅临杭州实在智能科技有限公司开展研讨座谈。 实在智能创始人&CEO孙林君、联合创始人&COO高扬、联合创始人&CMO张俊九、销售VP&运营商事业线负…

响应式Web开发项目教程(HTML5+CSS3+Bootstrap)第2版 例5-4 Document

代码 <!doctype html> <html> <head> <meta charset"utf-8"> <title>Document</title> </head><body> <canvas id"cavsElem" width"400" height"600">您的浏览器不支持Canvas…

备战蓝桥杯---二分(基础)

何为二分&#xff1f;形象的说&#xff0c;就是单调函数求零点。 我们先对二分查找简单的分析一下&#xff08;主要是模板及易错点&#xff09; 1.找>x的第一个位置&#xff1a; 2.找<x的第一个位置&#xff1a; …

广联达-EmailAccountOrgUserService-sql注入漏洞复现

产品简介 广联达OA是一款为企业提供综合办公解决方案的软件。它集成了多种功能&#xff0c;包括文档管理、流程审批、任务分配等&#xff0c;旨在提高企业内部的工作效率和协作能力。同时&#xff0c;广联达OA还注重安全性&#xff0c;通过多种措施保护企业数据和信息的安全。…