动态内存函数

当我们需要需要内存时,通常的开辟方法开辟的空间大小是提前设定好的的,如果要使用的空间大小在程序运行时才能知道,就要选择动态内存开辟了。
动态内存函数有malloc, calloc, realloc, free。
前三个函数是开辟或者改变空间的函数,free是释放内存的函数。
如果内存使用完没有用free释放掉,就会出现内存泄漏问题。
内存泄漏是指这样一种场景:程序分配了一块内存,但已经不再持有引用这块内存的对象(通是指指针),内存泄漏可能会导致系统响应速度变慢,进城占用的资源太多而被操作系统杀掉。所以申请的内存使用完后一定要将其free掉。
下面介绍如何动态开辟内存:
malloc:这个函数向内存申请一块连续可用的空间,并返回指向这块空间的指针,开辟成功后,返回一个指向开辟好空间的指针。开辟失败,就返回一个NULL指针。
所以在使用指针时,一定要判断指针是否为NULL!
函数原型:
void* malloc (size_t size);
内存释放和回收的函数free:
函数原型:
void free(void* ptr);
  如果参数ptr指向的空间不是动态内存开辟的,那free函数的行为是未定义的。
  如果参数ptr是NULL指针,则函数什么事都不做。
使用malloc和free函数时,要先声明头文件stdlib.h。
举个例子来使用这些函数:

#include<stdio.h>
#include<windows.h>
#include <stdio.h>

#pragma warning(disable:4996)
int main()
{
    int num = 0;
    scanf("%d", &num);
    int* ptr = NULL;
    ptr = (int*)malloc(num * sizeof(int));
    if (NULL != ptr)//判断ptr指针是否为空
    {
        int i = 0;
        for (i = 0; i<num; i++)
        {
            *(ptr + i) = 0;
        }
    }
    free(ptr);//释放ptr所指向的动态内存
    ptr = NULL;//如果不设置,ptr会成为野指针(悬垂指针),指向内存中的任意位置
    return 0;
}

calloc
函数原型:void* calloc (size_t num, size_t size);
calloc函数与malloc的区别只有calloc会在返回地址之前把申请的空间的每个字节初始化为全0,而malloc为全cd。
举个例子说明calloc的使用:

#include <stdio.h>
#include <stdlib.h>
int main()
{
 int *p = calloc(10, sizeof(int));
 if(NULL != p)
 {
 //使用空间
 }
 free(p);
 p = NULL;
 return 0;
} 

realloc
有时我们会发现开辟的空间太小了或者太大了,就要用到realloc函数对已开辟的空间大小做调整。
函数原型:
void* realloc (void* ptr, size_t size);
ptr是要调整的内存地址,size是调整之后新大小,返回值是调整之后的内存起始位置。

#include <stdlib.h>
#include <stdio.h>
int main()
{
    int *p = NULL;
    int *ptr = NULL;
    ptr = realloc(ptr, 1000);
    if (ptr != NULL)
    {
        p = ptr;
    }
    free(p);
    return 0;
}

以上就是动态内存函数的基本介绍,在使用中一定要注意:
 1.开辟内存后,使用ptr时要判断是否为NULL;
 2.使用完内存后,一定要用free函数释放内存。
 3.不要重复用free释放。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值