内存管理是计算机编程中最为基本的只是领域之一。我们平时编程中,少不了对内存的操作,接下来我们以一下3 个方面了解一下内存管理的基本知识

*内存管理是计算机编程中最为基本的只是领域之一。我们平时编程中,少不了对内存的操作,接下来我们以一下3 个方面了解一下内存管理的基本知识。

1. 了解内存的分类
2. 掌握内存管理的基本操作

一、内存的分类

1、静态内存
是指在程序开始运行时由编译器分配的内存,他的分配是在程序开始编译时完成的,不占用CPU资源。程序中的各种变量,在编译源程序时系统就已经为其分配了所需的内存空间,当该变量在作用域内使用完毕时,系统会自动释放所占用的内存空间。变量的分配与释放,都无需程序员自己考虑。

优点
①,使用方便,
②,减少了很多内存资源的风险,如内存泄漏,内存耗尽等问题。

缺点
①,在使用一个数组时,静态内存会预先定义数组的大小,定义数组前并不确定数组中会存放多少数据,多以在使用时,会存在溢出问题, 或者内存空间的浪费。
②,静态内存在定义域结束时会被系统收回,该变量也会随之释放。

2,动态内存
当用户无法确定空间的大小,或者空间太大、栈上无法分配时,会采用动态内存方式分配内存。在使用动态内存时,程序员可以自行控制内存的分配和释放。关于分配对少,合适分配与释放等信息,都由程序员根据需要随时实现。

	优点:
	①:分配自由。
	②:可以分配更大的空间
	缺点:
	①:为程序带来了一定风险,如果不及时的释放内存,可能会造成内存泄漏或者内存耗尽。

3,动态内存与静态聂村的区别:
①:静态聂村的分配时在程序开始编译时完成的,不占用CPU资源;而动态内存的分配是在程序运行时完成的,动态内存的申请与释放都是占用 CPU资源的。
②:静态内存时在栈上分配的,动态内存是在堆上分配的。
③:动态内存分配需要指针和引用数据类型的支持,而静态内存不需要。
④:静态内存分配是在编译前就已经确定了内存块的大小,属于按计划分配内存;而动态分配内存是在程序运行过程中,根据需要随时分配的,属于按需分配。
⑤:警惕内存的控制权是交给编译器的,而动态内存的控制权是有程序员决定的。

二、内存管理的基本操作

1.分配内存
①:malooc()函数
函数原型:

void  * malloc(unsigned int size);

该函数的功能是分配长度为size字节的内存块。
如果分配成功,则返回被分配内存的指针,否则返回NULL.
注意:当内存不在使用时,要使用free()函数释放内存块。
eg:

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

int main(int argc, const char *argv[])
{
	int * buffer;
	buffer = (int *)malloc(400);   //  申请一块400字节的内存空间
	if(buffer != NULL)             // 如果申请到了
	{
		printf("it is ok\n");
	}
	free(buffer);                  // 释放内存空间

	return 0;
}

我们可以看到运行结果如下:
说明明在这里插入图片描述
说明已经成功申请到了内存。

②:calloc()函数
函数原型:

void  * calloc(unsigned n, unsigned size);

改函数的功能是在内存的动态存储区域中分配n个长度为size的内存块。
如果分配成功,则返回指向被分配内存的指针;否则返回NULL。 同样,内存不在使用时要用free()函数释放内存块。

void int main(int argc, const char *argv[])
{
	long * buffer;
	buffer = (long *)calloc(20, sizeof(long));  	   	//   申请一块长整型数组空间
	free(buffer); 								        // 释放内存

	return 0;
}

③:realloc()函数
函数原型:

void * realoc(void * mem_address, unsigned int newsize);

该函数的功能是调整mem_address所指内存区域的大小为newsize长度。
如果重新分配内存成功,则返回指向被分配内存的指针;否则返回NULL,同样,当内存不在使用时,应用free()函数将内存空间释放。
**注意:**当参数mem_address指向NULL时, 即调整空指针所指向的内存区域的大小为newsize长度,此时realloc()函数的功能与malloc()函数相同。若参数newsize为0,即要调整成的长度为0,realloc()函数所实现的功能就相当于free()函数,释放掉该内存区域。

④:memset()函数
函数原型:

void *memset(void *s, char ch, insigned n);

该函数的功能是设置s中所有的字节为 ch ,s数组的大小是n。
、常用作内存清除。
⑤:free()函数
函数原型:

void free(void *memblock);

通过malloc()、 calloc()、realloc()函数分配完动态内存后,在程序中可以使用这些内存空间,咋使用完动态内存后,一定要用free()函数释放掉该块内存的区域,以免造成内存泄漏等问题。当释放掉内存后,原来指向内存空间的指针就会变成悬空的指针,这时再使用该指针时就会发生错误。
参数memblock表示要被释放的内存区块。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值