C语言学习【18】-动态内存分配(malloc函数)以及free以后的问题

传统数组的缺点:

1、数组长度必须事先制定,且只能是常整数,不能是变量;

eg:

int a[5] ;//OK
int len = 5; int a[len];   //Error

2、传统形式定义的数组,在函数运行期间该数组的内存程序员无法手动释放(只能系统释放),系统为该函数中数组所分配的空间会一直存在,直到数组所在函数运行完毕时,数组的空间才会被系统释放。

3、数组的长度一旦定义,其长度就不能再更改

     数组的长度不能再函数运行的过程中动态的扩充或者缩小

4、A函数定义的数组,在A函数运行期间可以被其他函数使用,但A函数运行完毕之后,A函数中的数组将无法再被其他函数使用,因为数组所占内存被释放了

为什么需要动态内存分配?

为了克服以上传统数组的缺陷。

#include <stdio.h>
#include <malloc.h>

int main(void)
{
    int i = 5;   //这里给 i 分配内存的分配方式为静态分布
    int * p = (int *)malloc(4);  
/*
1、要使用malloc()函数,必须要添加malloc.h头文件
2、malloc函数只有一个形参,并且形参是整形
3、4 表示请求系统为本程序分配4个字节,这里注意:如果4并非为int的长度,因为int的长度在不同软件、不同机器上可能是不一样的,所以一般我们会写sizeof(int)才更严谨。
4、malloc函数只能返回已分配内存的首字节地址(要注意的点有点两个:1、malloc函数返回值有一个;2、malloc函数返回值是一个地址)该地址需要被强制转换才能赋值给指针变量p;
5、该行分配了两个块内存:一个是 p变量,静态内存空间;一个是malloc(4),动态内存空间(可被强制转化)
6、p本身所占的内存是静态分配的,p指向的的内存是动态分配的
*/
    *p = 5;  //
    free(p); //这里释放的是指针变量p指向的动态内存,而 p 变量所占内存是静态的,所以不能被程序员释放,而只能被系统释放


return 0;
}

关于释放free()

free()用于释放掉malloc()函数分配的内存,释放掉以后该程序就失去了这个空间的控制权限。

输出结果为:

我们可以看到 free 过后的指针变量的值也是不变的,即依然指向原堆地址,但是指向的内存空间已经归还给系统了,不能再被这个程序所控制。则这个指针就有变成野指针的危险,我们对 *p 进行输出,值为0,之前我们在对野指针进行输出的时候输出的是个垃圾值,这里可能每个编译器都不太一样,所以为了防止变成野指针,我们应该将该指针置空。

我自己对野指针的理解

而对于野指针我是这样理解的,就像定义一个非指针变量一样,没有进行初始化的时候其内存里面的值是垃圾值,虽然是垃圾值影响的只是当前内存。————而野指针不一样,如果没有对指针进行初始化,该程序就会把指针变量里的垃圾值当作一个确定的地址值,然后根据这个地址值找到对应的内存进行读写操作,如果这个内存正好是程序内某变量分配到的空间还好(几乎不可能发生),如果指向的是没有分配给本程序变量的内存则就成了非法操作。

举个不太恰当的例子,如果男方(指针变量)有女方(其他变量)的地址,而且家长同意将女方许配给男方,那么男方则可以到女方家里访问,如果男方有一个地址,但是这个地址不知道是男人还是女人的地址,如果男方强行到这个地址把人接走,不免要被送到警察局(非法操作)。

void freepoint(int * p)
{
    if(NULL != p) //判断是否是空指针,空指针不属于野指针
    {
        free(p);  //释放 p 指向的内存空间
        p = NULL;   //将 p 置空
    }

    
}

 

 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值