C语言学习(八)typedef 虚拟内存 malloc/free

目录

  • 一、typedef 类型重定义
    • (一)使用
    • (二)define和typedef的区别
      • 1. 编译处理的阶段不同
      • 2. 功能不同
  • 二、虚拟内存
    • (一)虚拟内存分布
    • (二)内存分布
      • 1. 静态分配
      • 2. 动态分配
  • 三、malloc/free函数
    • (一) malloc函数
        • (1)定义
        • (2)使用
    • (二) free函数
    • (三) 使用
  • 四、内存泄漏
    • (一)概念
    • (二) 规避方法
    • (三)示例

一、typedef 类型重定义

(一)使用

typedef <数据类型> <标识符>

typedef int int32_t; 

typedef int arr_t[2][3];//两行三列的二维数组类型

typedef int(*fun_t)(int,int); //定义int(*)(int,int)类型

(二)define和typedef的区别

1. 编译处理的阶段不同

define在预处理阶段,typedef参与编译阶段

  • 注:编译的过程:
  • 预处理:展开头文件,删除注释,宏替换
    gcc - E hello.c -o hello.i
    hello.i 就是预处理文件。预处理不会检查语法错误。
  • 编译:语法统计,词法统计,语义分析
    gcc -S hello.i -o hello.s
    生成一个汇编文件。编译会检查语法错误
  • 汇编
    gcc -c hello.s -o hello.o
    生成一个二进制文件。
  • 链接:链接库文件,生成一个可执行的二进制文件
    gcc hello.o -o hello

2. 功能不同

define是字符串原样替换;typedef是用于类型重定义

二、虚拟内存

(一)虚拟内存分布

图片1

  • 内核空间:(0xcccc cccc~0xffff ffff)程序共用,不允许用户使用
  • 栈区:空间自动申请,自动释放;向下生长
    主要存放局部变量,未初始化时是乱值。
    (栈区空间,windows是2M,可以调至10M;在Linux中是8M)
  • 堆区:手动申请,手动释放;向上生长
    malloc / realloc / calloc
    (堆区空间,大概1.9G)
  • 常量区
    .bss段:未初始化的全局变量
    .data段 :初始化的全局变量
    .readonly段:只读段
    .text段 (代码区):程序代码

mmu固件:将虚拟内存映射到物理内存中。

eg:分析以下数据存放在内存中的位置:number1 , number2, number3, number4, p1, p2 ,p3 *p1,*p3, function, *p2

include <stdio.h>

int number1;  
未初始化的全局变量:常量区-->.bss段
int number2 = 10;   
初始化的全局变量:常量区-->.data段
字面量值10存储在常量区。

int function() 代码:常量区-->代码区
{
    int number3 = 30;  初始化的局部变量:栈区
    int number4;  未初始化的局部变量:栈区
}
int main() 代码:常量区-->代码区
{
    char * p1 = "hello world";  p1 局部变量:栈区
    *p1:常量区-->readonly段
    char p2[]= "abc"  p2 局部变量:栈区
    *p2:栈区
    char *p3 = (char *)malloc(20);   
    p3 局部变量:栈区; p3指向的内存空间 堆区
    free(p3);
    p3 = NULL;
}
  • 注:当程序加载到内存中时,number2的内存空间(在.data段)会被分配,
    并且其值会被初始化为10(这个值来源于常量区,但在运行时它是存储在.data段中的)。

(二)内存分布

C语言分配内存的方法:静态分配 动态分配

1. 静态分配

在编译节点的时候,已经确定了分配空间大小。
eg:int a=10; intarr[2][2];

2. 动态分配

编写程序时,不确定要申请多少空间,在执行时根据需要进行的空间分配。
eg:malloc分配的空间就属于动态分配。

三、malloc/free函数

(一) malloc函数

(1)定义
头文件(标准库文件):
#include <stdlib.h>

函数原型:
void *malloc(size_t size);

函数功能:
 在内存中(堆)区中开辟指定大小的地址连续的空间。
 
函数参数:
 size_t  无符号整型,size表示开辟多少字节空间。

函数返回值:
 成功,返回开辟空间的首地址;失败,返回一个NULL
(2)使用

申请空间为一段连续的空间:
① 可以使用下标进行访问
②可以通过指针进行访问

(二) free函数

头文件(标准库文件):
#include <stdlib.h>

函数原型:
void free(void *ptr);

函数功能:
 释放手动申请的空间。
 
函数参数:
 void* ptr: malloc/realloc/calloc申请的空间的首地址
  • 注:释放已经释放过的指针会造成程序错误。
  • 但是指针指向NULL时,释放多次都不会报错。

(三) 使用

#include <stdio.h>
#include <stdlib.h>

int main()
{
	//申请空间
	int *p =mymalloc(20);
	if(!p)
	{
		printf("create fail!\n");
		return -1;
	}
	//向空间内写值
	*p = 10;
	*(++p)= 20;
	//读值
	for (int i=0;i<20;i++)
	{
		printf("%d ",*(p+i));
	}
	//释放空间
	free(p);
	p = NULL;
	/*释放完空间后,将指针指向NULL
	/指向NULL后,再次释放不会报错*/
}

int mymalloc(int size)
{
	int *p = (int *)malloc(size);
	if(!p)
	{
		printf("fail!\n");
		return -1;
	}else
	{
		prnintf("sucess:%p\n",p);
	}
	return 0;
}

eg
功能需求
定义一个函数: create 功能: 在内存中申请n个字节大小. n是一个参数.
这个函数的返回值是指针类型.
set(指针)函数 功能: 从键盘中输入n个值, 将N个值存入 create创建的空间中.
sort函数():使用冒泡排序对这n个值进行排序.
max函数(): 返回空间中的最大值
min函数(): 返回空间中的最小值.、

代码实现

#include <stdio.h>
#include <stdlib.h>

int min(int *arr,int len);
int max(int *arr,int len);
void sort(int *arr,int len);
void set(int *a,int n);
int* create(int size);
void show(int *arr,int size);
void create_noReturn(int **p,int size);//使用二级指针传参

int main()
{
    int size;
    //申请空间
    printf("please input size:");
    scanf("%d",&size);
	/*** 
	* int *p = NULL;
	* create_noReturn(&p,size);
	***/
    int *p = create(size);//20个字节,5个int
    //判断p空间是否申请成功
    if(p!)
    {
    	printf("create fail!!");
    	return -1;
    }
    //向空间内写值
    set(p,size);
    //排序,读值
    sort(p,size);
    show(p,size);

    printf("MAX:%d\n",max(p,size));
    printf("MIN:%d\n",min(p,size));
    //释放空间
    free(p);
    p = NULL;
}
void show(int *p,int size)
{
    for(int i=0;i<5;i++)
    {
        printf("%d ",*(p+i));
    }
    putchar(10);
}
//申请n字节大小,返回值是申请空间的指针
int* create(int size)
{
    int *p = (int *)malloc(4*size);
    if(!p)
    {
        printf("fail!\n");
        return NULL;
    }
    return p;
}
//无返回值的空间分配
void create_noReturn(int **p,int size)
{
      int s=4*size;
      *p =(int*)malloc(s);
  }   

void set(int *a,int n)
{
    for(int i=0;i<n;i++)
    {
        printf("please input %d num:",i+1);
        scanf("%d",a+i);                                                                                                                                                                                                                                                                                                       
    }
}

//排序
void sort(int *arr,int len)
{
    int flag = 0;
    for(int i=0;i<len-1;i++)
    {
        flag = 0;
        for(int j=0;j<len-i-1;j++)
        {
            if(*(arr+j)>*(arr+j+1))
            {
                int temp=*(arr+j);
                *(arr+j)=*(arr+j+1);
                *(arr+j+1)=temp;

                flag=1;
            }
        }
        if(!flag) break;
    }
}

//最大值
int max(int *arr,int len)
{
    int max = *arr;
    for(int i=0;i<len;i++)
    {
        if(max<(*(arr+i)))
            max = *(arr+i);
    }
    return max;
}

//最小值
int min(int *arr,int len)
{
    int min = *arr;
    for(int i=0;i<len;i++)
    {
        if(min>(*(arr+i)))
            min = *(arr+i);
    }
    return min;
}

四、内存泄漏

(一)概念

在C语言中调用malloc/calloc/realloc函数时,申请内存后没有调用free函数进行释放内存,导致内存越用越少。

(二) 规避方法

当空间使用完毕后,及时释放内存。

(三)示例

int main()
{
	int * p =malloc(20);
	p = malloc(20);
	
	free(p);
	return 0;
}

此时p指向第二次申请的内存空间,没有指针指向第一次申请的内存空间。

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

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

相关文章

用sunoAI写粤语歌的方法,博主已经亲自实践可行

粤语歌还是很好听的&#xff0c;那么如何使用suno进行粤语歌的创作呢&#xff1f; 本文和大家进行分享下如何进行粤语歌曲的创作。 访问地址如下&#xff08;电脑端/手机端一个地址&#xff09;&#xff1a; ​https://suno3.cn/#/?i8NCBS8_WXTT 在微信浏览器中也可以直接…

RT-DETR改进教程|加入SCNet中的SCConv[CVPR2020]自校准卷积模块!

⭐⭐ RT-DETR改进专栏|包含主干、模块、注意力机制、检测头等前沿创新 ⭐⭐ 一、 论文介绍 论文链接&#xff1a;http://mftp.mmcheng.net/Papers/20cvprSCNet.pdf 代码链接&#xff1a;https://gitcode.com/MCG-NKU/SCNet/ 文章摘要&#xff1a; CNN的最新进展主要致力于设计更…

文字转成活码的3步操作,手机扫码即可查看文本信息

现在经常会通过二维码的方式来传递通知的文字信息&#xff0c;只需要分享文字生成二维码的图片到微信群或者印刷出来&#xff0c;其他人就可以通过扫码来查看文字内容&#xff0c;有利于其他人更快速的获取信息。 目前文本静态码无法通过微信来扫码展示&#xff0c;那么想要解…

服务器被后台爆破怎么处理

服务器后台遭受密码爆破攻击是网络安全中常见的威胁之一&#xff0c;这种攻击通过不断尝试不同的用户名和密码组合来破解系统登录凭证&#xff0c;一旦成功&#xff0c;攻击者便能非法访问系统资源。 本文将介绍如何识别此类攻击&#xff0c;并采取有效措施进行防御&#xff0c…

ETL-kettle数据转换及组件使用详解

目录 一、txt文本转换成excel 1、新建、转换 2、构建流程图 3、配置数据流图中的各个组件 3.1、配置文件文本输入组件 3.2、 配置Excel输出组件 4、保存执行 二、excel转换成mysql &#xff08;1&#xff09;在MySQL数据库中创建数据库&#xff0c;这个根据自身情况。我…

(python)cryptography-安全的加密

前言 cryptography 是一个广泛使用的 Python 加密库&#xff0c;提供了各种加密、哈希和签名算法的实现。它支持多种加密算法&#xff0c;如 AES、RSA、ECC 等&#xff0c;以及哈希函数&#xff08;如 SHA-256、SHA-384 等&#xff09;和数字签名算法(如 DSA、ECDSA 等). 目录 …

一本书打通SLAM在智能汽车/自动驾驶领域应用

自动驾驶技术已成为当今数字化时代汽车行业的热点话题之一。随着技术的不断成熟&#xff0c;越来越多的车辆采用激光SLAM&#xff08;即时定位与地图构建&#xff09;和视觉SLAM技术&#xff0c;实现更高层次的智能网联汽车。SLAM技术在智能网联汽车中的应用是非常重要的&#…

[XYCTF新生赛]-PWN:baby_gift解析(函数调用前需清空eax)

查看保护 查看ida 这里有一处栈溢出&#xff0c;并且从汇编上看&#xff0c;程序将rbp0x20处设置为了rdi&#xff0c;让我们可以控制rdi的值。而程序没有可利用的pop。 完整exp&#xff1a; from pwn import* pprocess(./babygift) premote(gz.imxbt.cn,20833) printf_plt0x4…

如何通过ETL工具对数据进行去重

在数据处理流程中&#xff0c;数据去重是一个至关重要的环节&#xff0c;它能够确保数据分析的准确性和效率。ETL&#xff08;Extract, Transform, Load&#xff09;工具作为数据集成的重要组成部分&#xff0c;提供了强大的功能来帮助用户实现数据的抽取、转换和加载&#xff…

【Unity Shader入门精要 第7章】基础纹理(一)

1. 纹理映射 每一张纹理可以看作拥有一个属于自己的2D坐标空间&#xff0c;其横轴用U表示&#xff0c;纵轴用V表示&#xff0c;因此也称为UV坐标空间。 UV空间的坐标范围为[0&#xff0c;0]到[1&#xff0c;1]&#xff0c;在Unity中&#xff0c;UV空间也是从左下到右上&#…

神经网络复习--卷积神经网络及其扩展

文章目录 卷积卷积网络反向传播已知池化层误差&#xff0c;反向求上一层隐藏层误差已知卷积层的误差&#xff0c;推导该层的W, b的梯度 注意力机制Transformer卷积变体 卷积 卷积神经网络是一个多层的神经网络&#xff0c;每层由多个二维平面组成&#xff0c;每个平面由多个独…

免费pr相册模板mogrt|手机壁纸AI绘画摄影作品照片展示模板视频素材

pr相册模板mogrt&#xff0c;手机壁纸、电脑桌面壁纸、AI绘画、摄影作品、照片展示模板视频素材。 Premiere Pro 2023及以上版本。 全高清&#xff08;19201080&#xff09;分辨率/30fps。 通用表达式&#xff08;适用于所有特效语言&#xff09;。 免费下载&#xff1a;https…

防火墙技术的演进,什么是下一代防火墙(NGFW)?

防火墙技术的演进 防火墙技术的演进经历了不同阶段&#xff0c;从包过滤防火墙到状态检测防火墙&#xff0c;再到集成多种安全功能的UTM&#xff08;统一威胁管理&#xff09;设备&#xff0c;最终发展到具备应用识别能力的NGFW&#xff08;下一代防火墙&#xff09;。 包过滤…

49.乐理基础-拍号的类型-单拍子、复拍子

当前写的东西&#xff0c;如果只是想要看懂乐谱的话&#xff0c;它是没什么意义的&#xff0c;就像我们要把 0&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5。。。称为自然数&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5称为正整…

鸿蒙OS开发:【Stage模型应用程序包结构】

Stage模型应用程序包结构 为了让开发者能对应用程序包在不同阶段的形态更有清晰的认知&#xff0c;分别对开发态、编译态、发布态的应用程序结构展开介绍。 开发态包结构 在DevEco Studio上[创建一个项目工程]&#xff0c;并尝试创建多个不同类型的Module。根据实际工程中的…

MongoDB 推出新项目,助力企业构建生成式 AI 现代应用程序

MongoDB AI Applications Program可为组织提供战略路线图、行业专业知识及所需技术&#xff0c;加速从构思到大规模部署生成式 AI 应用程序 MongoDB (纳斯达克股票代码&#xff1a;MDB) 近日宣布推出 MongoDB AI Applications Program (MongoDB AI应用项目&#xff0c;简称&am…

使用VSCode生成代码、查询数据表

利用VSCode中百度生成 一、 1、输入内容&#xff1a;“给我生成一个student表&#xff0c;要求有id,createDate,userName,phone,age,sex,introduce的列信息,给我DDL与DML,5条信息都为中文信息&#xff0c;并且有一个userName必须等于张先生” 2、将生成的语句复制粘贴到数据库…

SpringBoot 3.2.5 + ElasticSearch 8.12.0 - SpringData 开发指南

目录 一、SpringData ElasticSearch 1.1、环境配置 1.2、创建实体类 1.3、ElasticSearchTemplate 的使用 1.3.1、创建索引库&#xff0c;设置映射 1.3.2、创建索引映射注意事项 1.3.3、简单的 CRUD 1.3.4、三种构建搜索条件的方式 1.3.5、NativeQuery 搜索实战 1.3.6…

Optional用法

说明&#xff1a;Optional和Stream一样&#xff0c;是Java8引入的特性&#xff0c;本文介绍Optional的几个实际用法。Steam流使用&#xff0c;参考下面这篇文章&#xff1a; Stream流使用 使用 1.保证值存在 // 1.保证值存在&#xff0c;pageNumber&#xff0c;pageSizeInte…

PR标题模板,视频内容要点提示文字列表模板剪辑素材

Premiere Pro的要点列表标题模板。 主要特点&#xff1a; 可以无限制地添加任意数量的列表项。 使用直观的控件轻松自定义列表的各个方面。只需点击几下&#xff0c;即可调整颜色、大小、位置等。 轻松调整颜色&#xff0c;享受完全的创作自由。 可以轻松调整列表项之间的间距…