c语言/c++动态内存开辟详解以及差别

目录

1.前言

1.1内存分布

1.2动态内存的分配

2.四个重要的内存函数

2.1malloc和free

2.2calloc

2.3realloc

3.常见错误

3.1对NULL指针进行解引用操作

3.2对动态开辟内存的越界访问

3.3使用free释放非动态开辟的空间

3.4使用free释放了动态开辟内存的一部分

3.5对同一块动态内存开辟的空间多次释放·

3.6动态开辟的空间忘记释放,造成内存泄漏

4.参考

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函数并不知道开辟空间的类型
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值