C语言动态内存分配之realloc函数

本文详细介绍了C语言中realloc函数的使用方法,包括其原型、参数、返回值,以及如何通过示例实现内存的扩容和缩容,强调了在实际编程中对内存管理的重要性。
摘要由CSDN通过智能技术生成

 realloc函数可以重用或扩展以前用malloc、calloc及realloc函数自身分配的内存。

realloc函数基本使用

函数原型

void* realloc(void* memblock, size_t size)
头文件为<stdlib.h>

参数需求

memblock是先前开辟的内存块的指针,size_t size指的是New size in bytes,新的字节数(不是增加的字节数,是新开辟的那块内存空间的字节数,返回值为调整之后的内存的起始地址);

函数返回值

realloc函数返回的是void*类型的指针,指向在堆区重新开辟的内存块的起始地址;

参考代码1【如何判断成功开辟一片动态内存】


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

int main() {
    // 定义指针并初始化为 NULL
    void *ptr = NULL;
    size_t size = 1024;

    ptr = realloc(ptr, size);

    if (ptr == NULL) {
        printf("realloc 函数返回 NULL\n");
    } else {
        printf("realloc 函数返回非 NULL\n");
    }

    return 0;
}

【注】size_t类型通常用于表示数组、字符串、动态分配的内存块等的大小。与其他整数类型不同(如int、long等),size_t保证能够存储任意大小的正整数,因为它是无符号类型,没有符号位,从而可以避免整数溢出的问题。 

参考代码2【使用该函数实现字符串输入输出】

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

int main() {
    // 初始分配的内存大小
    int initialSize = 10;
    // 实际分配的内存大小
    int size = initialSize;
    // 指向分配的内存的指针
    char *str = NULL;

    printf("请输入字符串:");
    // 动态分配内存
    str = (char *)realloc(str, size);
    scanf("%s", str);

    while (str[size - 1] != '\0') {
        // 如果内存不足,重新分配更大的内存
        size = size * 2;
        str = (char *)realloc(str, size);
        // 追加输入的字符
        scanf("%c", &str[size - 1]);
    }

    // 输出字符串,并在末尾添加负一作为结束标志
    printf("%s-%c", str, -1);

    // 释放分配的内存
    free(str);

    return 0;
}
 



扩容&缩容

扩容

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

int main() {
    int *arr = NULL;
    int size = 4;

    // 分配初始内存
    arr = (int *)malloc(size * sizeof(int));
    if (arr == NULL) {
        printf("内存分配失败\n");
        exit(1);
    }

    // 填充数组
    for (int i = 0; i < size; i++) {
        arr[i] = i;
    }

    // 检查是否需要扩容
    if (size == 4) {
        size *= 2;
        // 重新分配内存并复制数据
        arr = (int *)realloc(arr, size * sizeof(int));
        if (arr == NULL) {
            printf("内存重新分配失败\n");
            exit(1);
        }
    }

    // 输出扩容后的数组
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    // 释放内存
    free(arr);

    return 0;
}

缩容

引用一段我自己关注的博主的文章来给大家解释一下

如果我们realloc的新的内存块的大小<比之前动态内存malloc的大小,可不可以做到缩容来节省空间呢?
它有可能会原地缩容,也有可能会异地缩容。但我们一般不考虑缩容的问题,因为如果系统是异地缩容,它需要找一块空间,把原数据考虑过来,然后再把原空间释放,这样会有性能,时间上的代价。而且如果我们之后又要插入数据,那我们又要进行扩容。
总结一下来说:
缩容:以时间换空间
不缩容:以空间换时间
版权声明:本文为CSDN博主「_麦子熟了」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_63449996/article/details/124363899

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值