*内存管理是计算机编程中最为基本的只是领域之一。我们平时编程中,少不了对内存的操作,接下来我们以一下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表示要被释放的内存区块。