C语言-动态内存管理

更灵活的内存管理方式

malloc

-申请动态内存空间

函数原型:

-void *malloc(size_t size);

malloc函数向系统申请分配size个字节的内存空间,并返回一个指向这块空间的指针。

如果函数调用成功,返回一个指向申请的内存空间的指针,由于返回类型是void指针(void*),所以它可以被转换成任何类型的数据;如果函数调用失败,返回值是NULL。另外,如果size参数设置为0,返回值也可能是NULL,但这并不意味着函数调用失败。

#include <stdio.h>

int main()
{
    int *ptr;
    ptr = (int *)malloc(sizeof(int));
    if (ptr == NULL)
    {
        printf("分配内存失败!\n");
        exit(1);
    }

    printf("请输入一个整数:");
    scanf("%d", ptr);

    printf("你输入的整数是:%d\n",*ptr);

    return 0;
}

free

-释放动态内存空间

函数原型:

-void free(void *ptr);

free函数释放Ptr参数指向的内存空间。该内存空间必须是由malloc,calloc或realloc函数申请的。否则,该函数将导致未定义行为。如果ptr参数是NULL,则不执行任何操作。注意:该函数并不会修改ptr参数的值,所以调用后它仍然指向原来的地方(变为非法空间)。

#include <stdio.h>

int main()
{
    int *ptr;
    ptr = (int *)malloc(sizeof(int));
    if (ptr == NULL)
    {
        printf("分配内存失败!\n");
        exit(1);
    }

    printf("请输入一个整数:");
    scanf("%d", ptr);

    printf("你输入的整数是:%d\n",*ptr);
    free(ptr);
    printf("你输入的整数是:%d\n",*ptr);


    return 0;
}

calloc

-申请并初始化一系列的内存空间

realloc

-重新分配内存空间

内存泄漏

如果申请的动态内存没有及时释放会怎么样

总结一下,导致内存泄漏主要原因有两种情况:

-隐式内存泄漏(即用完内存块没有及时使用free函数释放)

-丢失内存块地址

malloc

malloc还可以申请一块任意尺寸的内存空间

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

int main(void)
{
    int *ptr=NULL;
    int num, i;
    printf("请输入待录入整数的个数:");
    scanf("%d", &num);
    ptr = (int*)malloc(num*sizeof(int));
    for (i=0;i<num; i++)
    {
        printf("请录入第%d个整数:",i+1);
        scanf("%d",&ptr[i]);
    }
    printf("你录入的整数是:\n");
    for (i=0;i<num;i++)
    {
        printf("%d\n",ptr[i]);
    }
    
    free(ptr);
    return 0;
}

初始化内存空间

以men开头的函数被编入字符串标准库,函数的声明包含在string.h这个头文件中:

-memset -- 使用一个常量字节填充内存空间

-memcpy -- 拷贝内存空间

-memmove -- 

-memcmp -- 比较内存空间

- memchr -- 在内存空间中搜索一个字符

calloc

函数原型:

-void *calloc(size_t nmemb, size_t size);

calloc函数在内存中动态的申请nmemb个长度为size的连续内存空间(即申请的总内存空间尺寸为nmemb *size),这些内存空间全部被初始化为0。

calloc函数与malloc函数的一个重要区别是:

-calloc函数在申请完内存后,自动初始化该内存空间为零

-malloc函数不进行初始化操作,里边数据是随机的

下边两种写法是等价的:

//calloc()分配内存空间并初始化

int *ptr = (int *)calloc(8,sizeof(int));

//malloc() 分配内存空间并用memset()初始化

int *ptr = (int *)malloc(8*sizeof(int));

memset(ptr, 0,8*sizeof(int));

realloc

函数原型:

-void *realloc(void *ptr, size_t size);

以下几点时需要注意的:

-realloc函数修改ptr指向的内存空间大小为size字节

-如果新分配的内存空间比原来的大,则就内存块的数据不会发生改变;如果新的内存空间大小小于旧的内存空间,可能会导致数据丢失,慎用!

-该函数将移动内存空间的数据并返回新的指针

-如果ptr参数为NULL,那么调用该函数就相当于调用malloc(size)

-如果size参数为0,并且ptr参数不为NULL,那么调用该函数就相当于调用free(ptr)

-除非ptr参数为NULL,否则ptr的值必须由先前调用malloc,calloc或realloc函数返回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值