为什么要用malloc申请空间
为什么要malloc()?何时要malloc()?如何使用malloc()?
函数原型:void *malloc(unsigned int num_bytes); //分配长度为num_bytes字节的内存块
返回值是void指针,void* 表示未确定类型的指针,void *可以指向任何类型的数据,更明确的说是指申请内存空间时还不知道用户是用这段空间来存储什么类型的数据(比如是char还是int或者其他数据类型),可以通过类型强制转化转化为其他任意类型指针。如果分配成功则返回指向被分配内存的指针(此存储区中的初始值不确定),否则返回空指针NULL。
为什么要?何时要?
malloc()是动态内存分配函数,用来向系统请求分配内存空间。当无法知道内存具体的位置时,想要绑定真正的内存空间,就要用到malloc()函数。因为malloc只管分配内存空间,并不能对分配的空间进行初始化,所以申请到的内存中的值是随机的,经常会使用memset()进行置0操作后再使用。
与其配套的是free(),当申请到的空间不再使用时,要用free()函数将内存空间释放掉,这样可以提高资源利用率,最重要的是----就是因为它可以申请内存空间,然后根据需要进行释放,才被称为“动态内存分配”!
malloc()函数实质体现在,它有一个可以将可用内存块连接成一个长长的列表的链表,这个链表就是所谓的空闲链表。调用malloc()函数时,它沿着连接表寻找一个大到可以满足用户请求要求的连续的内存块,然后将内存块一分为二,一块的大小与用户请求的内存大小相等,另一块就是剩下的内存块。接下来,它将用户申请的那块传递给用户,将另一块返回到连接表上(如果另一块有的话)。
调用free()函数的时候,它将用户想要释放的内存块链接到空闲链上。我们可以想到,最后的空闲链链接的内存空间一小块一块的块,如果这是用户申请分配一个较大的内存空间,那么空闲链上可能没有符合用户要求的内存块了,这个时候,malloc()函数请求延时,并开始在空闲链上翻箱倒柜的检查各内存块,对他们进行整理,将相邻的小内存块合并成较大的内存块。如果无法获得符合用于要求的内存空间,那么malloc()函数就会返回NULL,因此,调用malloc()函数的时候,一定要判断它的返回值是否为NULL。
如何使用?
int p;
p = (int)malloc(sizeof(int) * 128);
//分配128个整型存储单元,并将这128个连续的整型存储单元的首地址存储到指针变量p中
double pd = (double)malloc(sizeof(double) * 12);
//分配12个double型存储单元,并将首地址存储到指针变量pd中
free§;
free(pd);
p = NULL;
pd = NULL;
指针用完赋值NULL是一个很好的习惯。
内存泄漏:
例:
#include <stdio.h>
#include <malloc.h>
#define MAX 1000000
int main(void)
{
int a[MAX] = {NULL};
int i;
for(i=0;i<MAX;i++)
{
a[i]=(int)malloc(MAX); //此处没有判断返回值
}
return 0;
}
例:
#include “stdio.h”
#include “malloc.h”//malloc()函数被包含在malloc.h里面
int main(void)
{
char *a = NULL;//声明一个指向a的char*类型的指针a = (char*)malloc(100*sizeof(char));//使用malloc分配内存的首地址,然后赋值给aif(!a)//如果malloc失败,可以得到一些log, 此处返回条件判断错误,应为:if(NULL == a){perror("malloc");return -1;
}sprintf(a,"%s","HelloWorld\n");//"HelloWorld\n"写入a指向的地址printf("%s\n",a);free(a);//释放掉使用的内存地址return 0;
}
为什么要用malloc申请空间相关推荐
- C语言malloc申请空间函数的两种返回方法
测试ok,代码如下: /********************************************* 功能:malloc申请空间函数的两种返回方法* 作者:lml 时间:2020年4月1 ...
- 为什么结构体指针需要malloc申请空间
例如此时: int init(struct Node**head ) //结构体指针 初始化 { struct Node *newnode = (struct Node *)malloc(sizeof ...
- 二维数组malloc申请空间以及初始化方式
利用二重指针,注意malloc以及memset要在for内进行,因为malloc返回为一重指针地址char **obj;obj = (char **)malloc(sizeof(char *) *nu ...
- 数据结构-malloc申请动态空间-链表的创建
一:malloc申请动态空间注意以下事项: 1,malloc申请动态空间时必须声明类型; 2,使用malloc申请的空间在使用完成之后必须使用free释放; 3,malloc申请空间的类型必须和指向他 ...
- Linux申请空间(malloc)
1.进程在执行的过程中,malloc申请空间,不使用时,没有free就会出现内存泄漏; 如果进程结束了,那么所有向操作系统申请的内存都会被回放(释放); 2.申请1G或者更大空间,到底能不能成功? 如 ...
- malloc申请堆内存
1.malloc申请的空间,是否记录空间大小?若是记录,那所记录的空间大小在哪呢?为什么利用free释放不需要空间大小参数呢? malloc申请空间时,记录其空间大小(其空间上方,有一个数据头,头部信 ...
- 结构指针的坑之(定义结构体指针时并没有分配存储空间,所以要用malloc()申请空间)
这段代码会报错,核心转储 #include<stdio.h> #include <string.h>struct role // 定义一个结构体 { // char name[ ...
- malloc申请内存空间失败
上午在调试自己写的一段代码的过程中,发现malloc函数分配内存失败,仔细梳理了一下自己写的代码,失败的malloc操作之前也malloc了两三次,但都是成功的,网上搜了一下,都提到失败的原因可能是因 ...
- linux下的malloc申请的是虚拟还是物理的,关于malloc申请内存
自学笔记(一) 个人理解 linux内存采用分页的内存管理,而32位pc机还采用了段式内存管理,它的地址关系为:逻辑地址--->虚拟地址(也叫线性地址)--->物理地址. linux所有段 ...
最新文章
- Linux网络配置命令
- VS如何更改项目类型?
- Linux 下解压文件命令大全
- python学习之函数的参数类型
- vim的强大,vim设置和插件的使用,脱离windows才是王道
- 7-7 天梯赛的善良 (20 分)
- pycharm安装教程,超详细
- 一个完整的项目流程图_工程建设项目史上最完整的全流程图,必收藏备用!
- Python 动图、动画制作 —— moviepy、matplotlib.animation
- python实现观察者模式_举例讲解Python设计模式编程中的访问者与观察者模式
- android数据适配器参数,Android 万能适配器BRVAH
- 互联网服务器使用ipset 和iptables禁止国外IP访问
- SpringBoot实现Excel导入导出,好用到爆,POI可以扔掉了
- PDF文件怎么旋转保存
- nodejs和php性能,Nodejs 和PHP 性能测试结果
- 小猿圈解析linxu安装方式
- 第一章 命题逻辑(数理逻辑)
- 如何调试oracle,sqlserver存储过程
- 4月6日----4月10日一年级课程表
- originPro导出图像的关键设置
热门文章
- stb_image图像库处理tga转png
- 密钥ssh 配置操作
- HJY-F931A/YJ三相电压继电器
- QQ API设计说明书
- vTK颜色渲染-vtkLookupTable
- 【问题思考总结】旋转体的体积和函数在直线上下有关吗?【几何+微元】
- 他,是碾压爱迪生的科技天才!尼古拉特斯拉的一生竟是这样...
- 【每日新闻】国内首个3D缝纫机器人研制成功
- 您的浏览器没有获得Java Virtual Machine(JVM)支持。可能由于没有安装JVM或者已安装但是没有启用。请安装JVM1.5或者以上版本,如果已安装则启用它
- 如何使用 Google 的 AutoAugment 改进图像分类器