malloc函数,内存泄漏以及野指针

630 阅读2分钟

一、malloc函数

C 语言库函数malloc原型为 void malloc(size_t size),返回一个类型为void的指针,用于申请一块连续的指定大小的内存块区域以void类型返回申请的内存地址,如果申请空间失败,返回为NULL 、malloc函数在头文件stdlib.h里面,
一般将malloc函数和free函数一起使用,因为在Windows下面系统不会自动回收malloc开辟的空间,要free函数进行释放空间,在Linux下malloc在程序结束后,系统会回收这个空间。

示例代码

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

int main()
{
    int n;
    printf("请输入元素个数\n");
    scanf("%d",&n);
    int *parray;
//开辟了n x sizeof(int)大小的空间,因为malloc返回类型为void*,所以要强转为int*
    parray =(int *)malloc(n * sizeof(int));
    if(parray == NULL){
		printf("开辟空间失败\n");
	}  
    int i;
    for(i = 0;i< n;i++){

        printf("请输入第%d个数\n",i+1);
        scanf("%d",parray++);
     //   scanf("%d",&parray[i]);
    }

//上面scanf已经将指针偏移到了开辟的空间外,所以指针--
//这里n只能输入3,因为指针只减了3
    parray--;
    parray--;
    parray--;

    for(i = 0;i < n;i++){

        printf("第%d个数为%d\n",i+1,*parray++);
    }
    system("pause");
    return 0;
}

在这里插入图片描述

二、内存泄漏

1、内存泄漏的现象
就是程序刚运行起来是正常的,但是跑几个小时,或者几天,甚至几个月程序崩溃了,

2、内存泄漏的原因
比如用malloc申请的内存空间没有及时释放,但是系统又不会主动释放,内存泄漏会减少可用内存的数量,从而降低计算机的性能,如果分配太多的可用内存,应用程序会瘫痪,或者系统速度变慢。

3、怎样避免内存泄漏
注意在循环中有没有一直在申请空间
空间要及时合理释放

示例代码:

#include <stdio.h>
#include <stdlib.h>
int main()
{
     while(1){
        sleep(1);   //每隔一秒malloc一下     
        int* p = malloc(1024);//malloc隔一秒申请空间1024个字节(1Mb)时间久了内存就不足
                    
     }
        int* p = malloc(1024);
        free(p);   //用free函数释放空间     
        p = NULL;    // 注意要让p = NULL,不要让p变为野指针
	system("pause");
	return 0;
}

三、野指针

什么是野指针呢?
野指针就是指针的指向位置是不知道的,简单来说就是定义的指针变量没有初始化或者指针没有指向就是野指针,比如int p;p就是一个野指针,因为不知道它的具体指向。
而int
p ; p = NULL就不是野指针,一般在指针变量初始化,或者当指针p指向的内存空间释放时,都会让指针指向NULL,如果不指向NULL就会出现野指针、出现段错误。
在上面代码中用free(p)只是把内存空间释放了,但是并没有将指针p的值指向NULL,所以要将p = NULL,防止野指针。
通常判断一个指针是否合法,都是使用if语句测试该指针是否为NULL,如上代码。