目录
5.与c++的差别(malloc/free和new/delete的异同点)
1.前言
1.1内存分布
c语言中内存大致可以分为六个区域,自上而下:内核空间,栈区,内存映射区,堆区,数据段,代码段
例:
int c = 1;//储存在数据段
void Test() {
static int a = 1;//储存在数据段
int b = 1;//储存在栈里
int num[10] = { 1,2,3,4 };//储存在栈里;sizeof(num) = 40
char char1[] = "abcd";//char1和char1*都储存在栈里;sizeof(char1)=5,strlen(char1) = 4
char* pchar2 = "abcd";//pchar2在栈里,*pchar在数据段里
int* ptr1 = (int*)malloc(sizeof(int) * 4);//ptr1储存在栈里,*ptr1在堆里
//解释上面的代码含义以及为什么需要用free释放:malloc等空间申请都是在堆上进行申请的,所以必须由free来进行释放。对应常见错误3.6(因为对堆上的空间由程序员自己来管理)
int* ptr2 = (int*)calloc(4, sizeof(int));
int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);
free(ptr1);
free(ptr3);
}
1.2动态内存的分配
对于下列代码,申请的空间是固定的
int num=10; //向内存申请4个字节
int arr[10]={0}; //向内存申请40个字节
上述的开辟的空间的方式的特点:
1,空间开辟的大小是固定的
2,数组在申明时必须指定数组的长度,他所需要的内存在编译时分配。
其问题所在之处:对于数组arr[10],已经申请了40个字节的空间,如果部分没有使用就会造成浪费,或者不够,因此动态内存的分配很重要。
2.四个重要的内存函数
2.1malloc和free
c语言提供了一个动态内存开辟的函数:void* malloc (size_t size);(此函数向内存申请一块连续可用的空间,并返回指向这块空间的指针。
#void是空类型,void*是空类型指针,又叫万能指针,就是该指针能接收任意类型的指针,可以指向任何类型对象,所以不能对空类型指针进行解引用,必须强制类型转换成相应的指针类型,才能进行解引用操作。空类型指针不能进行解引用操作;不能进行±整数运算。同时在c语言里,空指针NULL指的是地址为0的那块空间,故对NULL是不能进行解引用操作的(对应错误类型3.1)
- size_t是指无符号的整型
- size是指大小,单位为字节
- 如果开辟成功,则返回申请的空间的起始地址;如果开辟失败,则返回一个NULL指针,故malloc的返回值一定要检查
- 返回值类型是void,所以malloc函数并不知道开辟空间的类型