堆内存管理

堆内存是代码段当中的其中一段,特点就是大,但不能与标识符建立联系,只能与指针配合使用
C语言没有提供管理堆内存的语句,而是标准库提供了一套管理内存的函数

函数

#include<stdlib.h>

void * malloc(size_t size);

功能:从堆内存中分配内存
参数
size 所申请的字节数,一般使用 sizeof 计算
返回值:所申请的内存的首地址
注意
1、如果申请内存失败或者size = 0,返回值为NULL或最后能够被成功free的值
2、所申请的内存没有初始化,内存是不确定的

		 int* p = malloc(4);
		 // 申请4个字节的地址,返回首字节的地址
		 // 有时相当于申请了一个数组arr[1]

void free(void *ptr);

功能:释放堆内存
参数
ptr -> 需要被释放的内存的首地址
注意
1、如果ptr的值不是malloc的返回值,可能会出现内存崩溃
2、写完申请语句就要立刻写释放语句,释放后指针的值立即滞空

		int* p = malloc(4);
		……
		free(p);  // 释放完后是野指针
		p = NULL;  // 变成空指针,比较安全

void *calloc(size_t nmemb, size_t size);

功能:从堆内存中申请内存
参数
nmemb -> 申请多块内存
size -> 申请每块内存的字节数
返回值:所申请的内存的首字节
注意: 所申请的内存会被初始化为0,如果申请内存失败或者nmemb、size的值为0,返回值为NULL
malloc VS calloc

		// void *malloc(size_t 500*4);  ==  void *calloc(size_t 500, size_t 4);
		// 每块4字节,申请500次

calloc的参数更清晰,内存会被初始化
malloc的速度更快(calloc每次都初始化,拖速度)

void *realloc(void *ptr, size_t size);

功能:调整已经申请到的内存的大小
参数
ptr ->已经申请到的内存的首地址
size ->调整后的大小
返回值:调整后的内存首地址
注意: 该函数既有申请内存的功能,也有释放内存的功能
ptr = NULL,size > 0,则是申请内存的功能(相当于malloc)
ptr = 某值有意义,size = 0,则是把某块内存的大小调整为0,相当于释放内存
返回值要重新接收
// 若后续有再申请内存,且前块内存调整位置不够,realloc会先将要调整的内存复制到空位,再把原内存释放掉,故内存首地址可能发生改变,需要重新接收

如果内存需要被初始化或都整体赋值/批量赋值可以使用以下两个函数:

#include <strings.h>

void bzero(void *s, size_t n);

功能:把指定内存中的数据设置为0
参数
s ->内存(被初始化)的首地址
n ->内存的大小(需要初始化的字节数)
无返回值

#include <string.h>

void *memset(void *s, int c, size_t n);

功能:把指定的内存以字节为单位设置为指定的值
参数
s ->内存(被初始化)的首地址
c ->字节中存储的数据

		// c参数的类型 int 具有迷惑性,实际值的范围小于255
		#include <stdio.h>
		#include <stdlib.h>
		#include <string.h>
		int main()
		{
    		int* p = malloc(10*sizeof(int));
			memset(p,1,40);
			for(int i=0; i<10; i++)
			{
				printf("%d\n",p[i]);
			}
		}
		// 因为是以字节为单位,故打印值为00000001 00000001 00000001 00000001的十进制转化

n ->内存的大小(需要初始化的字节数)
返回值:设置后的内存首地址
返回值的作用:链式调用(把函数的返回值当作另一个函数的参数,以此达到精简代码的目的

		 int* p = malloc(4);
		 realloc(memset(p,1,4),8);

void*

无类型指针(万能指针)
不能解引用,必须先转换成其它有效类型再解引用
void* 可以自动转换成任意类型指针
任意类型的指针也可以自动转化成 void*
:C语言中可以自动转换,但C++要手动

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值