动态内存分配

一、系统内存分区

C语言程序编译环境下的系统内存有5个分区,每个分别有不同的使用者:

1、栈区(Stack):编译系统自动分配释放,主要存放函数参数、局部变量等。

2、堆区(Heap):由程序员来进行分配释放管理,一般由malloc,new等内部存储函数使用,如果没有收回,程序结束时会由操作系统收回。创建堆时,一般在堆的头部(head)用一个字节存放堆的大小;回收堆时,通过查看这个字节(head)中的内容,可得知需要释放多大的内存。(如链表就是用堆区)

3、全局区(或静态区):存放全局变量和静态变量,程序结束时由系统释放,分为全局初始化区和全局未初始化区。

4、常量区:存放常量,程序结束时由系统释放。

5、程序代码区(上面4个区统称为数据区):存放运行或准备运行的程序代码,由系统调度。

要是用malloc函数和free函数等要是用#include <malloc.h>或#include <stdlib.h> 。

二、malloc函数

表达为:void * malloc(unsigned int size(准备分配的存储空间的大小));(返回类型是一个通用指针)

功能:分配一块长度为size字节的连续空间,并将该空间的首地址作为函数的返回值。如果函数没有成功地执行,返回值为空指针(NULL)。由于返回的指针的基类型是void,应该通过类型转换后才能存入其他基类型的指针变量。

如:

int *p;
p=(int*)malloc(sizeof(int));

三、free函数

表达为:void free(void * block);

功能:释放以前分配给指针变量block的动态空间,但指针变量block不会自动变成空指针。一般在使用malloc语句后必须使用free语句去释放你所分配的内存,否则内存会一直存储而不会释放,造成垃圾内存。

如:

int *p, i=0;
if((p=(int*)malloc(10*sizeof(int)))!=NULL)
{
	for(i=0;i<10;i++)
		p[i]=i*i;
		free(p);
}
注:上面的if语句是严谨的,如果你要分配的内存空间巨大,系统可能没有这么大的存储空间分配给你,所以可能分配失败,所以这个if语句就可以防止分配不成功的情况。
我们就上面的p=(int*)malloc(10* sizeof(int))分析一下。10* sizeof(int)=40,所以一共分配了40个字节,而程序是以int整数类型去看待这40个字节的,也就是说分成了10个int整数的空间。

四、memset函数将存储空间初始化

表达为 void memset(指针变量,初始化值,空间大小);

如:

int *ip;
ip=(int *)malloc(10*sizeof(int));
memset(ip,0,10*sizeof(int));//即将所分配的空间全部初始化为0

一般可用memset函数进行数组的初始化,非常便捷。

参考:懒猫老师-C语言-动态内存分配_哔哩哔哩_bilibili
  • 5
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值