C语言:什么是动态内存管理?

news/2025/2/23 11:08:34

动态内存管理是指在程序运行期间,根据实际需要动态地分配和释放内存空间的过程。与静态内存分配在编译时就确定内存大小不同,动态内存管理允许程序在运行时根据具体情况灵活地申请和释放内存

主要通过 malloc 、 calloc 、 reallocfree 函数来实现。

malloc

用于分配指定字节数的内存空间;

perror 函数会将当前全局变量 errno 所存储的错误码转换成错误信息并输出到标准错误输出流( stderr )。

使用malloc需要注意的点:

1、检查返回值: malloc 在内存分配成功时,返回指向分配内存起始地址的指针;失败则返回 NULL 。

2、内存释放:使用完 malloc 后,要调用 free 函数释放,防止内存泄。并且释放内存后,应将指针赋值为 NULL ,避免成为悬空指针(指向已释放内存的指针)

3、合理估计内存大小:根据实际需求合理确定要分配的内存字节数,避免分配过大造成内存浪费,或过小导致数据存储不下。
类型转换: malloc 返回的是 void* 类型指针,使用时需根据实际用途进行强制类型转换,使其指4、向所需类型的内存:如 int *ptr = (int *)malloc(10 * sizeof(int));  。
5、初始化内存: malloc 分配的内存是未初始化的,保留的是不确定的值。如果需要确定的初始值,可使用 memset 等函数进行初始化,如 memset(ptr, 0, 10 * sizeof(int)); 将分配的内存初始化为0。
6、注意系统限制:可分配的内存大小受系统限制,申请内存过大可能导致分配失败。

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

int main() {
    int* arr;
    int size = 5;
    // 使用malloc分配存储5个整数的内存空间
    arr = (int*)malloc(size * sizeof(int));
    arr = (int*)malloc(5 * sizeof(char));//申请5个char类型的空间 (还可以这么写
    if (arr == NULL) {
        //↓perror()作用:将错误码转换成错误信息打印出来  
        //打印出failed::并且  在failed::后面打印错误信息,
        perror("failed::");
        return 1;
    }
    // 为数组元素赋值
    for (int i = 0; i < size; i++) {
        arr[i] = i + 1;
    }
    // 输出数组元素
    for (int i = 0; i < size; i++) {
        printf("%d ", arr[i]);
    }
    printf("\n");

    // 释放动态分配的内存
    free(arr);
    arr = NULL;
    return 0;

calloc

通常用来为数组分配内存,它会把分配的内存初始化为0;

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

int main() {
    // 分配一个包含5个整数的数组的内存空间,并初始化为0
    int *intArray = (int *)calloc(5, sizeof(int));
    if (intArray == NULL) {
        perror("failed::");
        return 1;
    }

    // 输出数组的初始值,验证是否已初始化为0
    int i = 0;
    for (i=0; i < 5; i++) {
        printf("intArray[%d] = %d\n", i, intArray[i]);
    }
    free(str);
    return 0;
}

运行结果(calloc分配的内存初始化为0)

realloc

可改变已分配内存块的大小;

或者↓

int main() {
    // 分配一个包含5个整数的数组的内存空间,并初始化为0
    int* ptr = (int*)malloc(5*(sizeof(int)));
    if (ptr == NULL) {
        perror("failed::");
        return 1;
    }

    // 输出数组的初始值,验证是否已初始化为0
    int i = 0;
    for (i = 0; i < 5; i++) {
        ptr[i] = 7; //将ptr[]中每个元素置成7
        printf("intArray[%d] = %d\n", i, ptr[i]);
    }
    //空间不够用?  那就扩大空间(也叫扩容)
    int* addptr = (int*)realloc(ptr,10 * (sizeof(int)));
    for (i = 0; i < 5; i++) {
        ptr[i] = 9; //将ptr[]中每个元素置成7
        printf("intArray[%d] = %d\n", i, ptr[i]);
    }
    //释放指针
    free(addptr);//(只释放后面的指针就好了)
    addptr = NULL;
    return 0;
}

free

用于释放不再使用的内存空间。
 

 free 函数用于释放先前通过 malloc 、 calloc 或 realloc 函数分配的动态内存空间

注意事项
 释放非动态分配的内存会导致未定义行为。

只能释放一次动态分配的内存块,重复释放同一指针会导致程序出现错误。

释放内存后,应将指针设置为 NULL ,防止悬空指针。

注意!!!释放的是动态内存空间!!!

当你使用这些函数分配内存后,在不再需要使用该内存时,应该使用 free 函数来释放它,以便让系统回收资源,避免内存泄漏。

好了 下课!!!!!!!


http://www.niftyadmin.cn/n/5863357.html

相关文章

04-DevOps-安装并初始化Jenkins

Jenkins由Java语言开发&#xff0c;用于监控持续重复的工作&#xff0c;包括&#xff1a;持续的软件版本发布/测试项目&#xff0c;监控外部调用执行的工作。 Jenkins主要起到一个驱动者&#xff0c;流水线的工作&#xff0c;下游代码拉取&#xff0c;上游生产环境发布、构建&…

PHP2(WEB)

##解题思路 打开页面什么线索都没有&#xff0c;目录扫描只是扫出来一个index.php&#xff0c;而源代码没有东西&#xff0c;且/robots.txt是不允许访问的 于是一番查询后发现&#xff0c;有个index.phps的文件路径&#xff0c;里头写着一段php的逻辑&#xff0c;对url的id参数…

kafka+spring cloud stream 发送接收消息

方案 1&#xff1a;使用旧版 StreamListener&#xff08;适用于 Spring Cloud Stream < 2.x&#xff09; 1. 添加依赖&#xff08;pom.xml&#xff09; <!-- Spring Cloud Stream Kafka Binder --> <dependency> <groupId>org.springframework.clo…

leetcode 题目解析 第3题 无重复字符的最长子串

给定一个字符串 s &#xff0c;请你找出其中不含有重复字符的 最长 子串的长度。 示例 1: 输入: s “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”&#xff0c;所以其长度为 3。 示例 2: 输入: s “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”…

C# 从基础神经元到实现在0~9数字识别

训练图片:mnist160 测试结果:1000次训练学习率为0.1时,准确率在60%以上 学习的图片越多&#xff0c;训练的时候越长(比如把 epochs*10 10000或更高时)效果越好 using System; using System.Collections.Generic; using System.Drawing; using System.IO; using System.Windo…

SAP S4HANA Administration (Mark Mergaerts Bert Vanstechelman)

SAP S4HANA Administration (Mark Mergaerts Bert Vanstechelman)

spring中事务为什么会回滚?什么原理?

事务回滚是保证数据一致性的关键机制&#xff0c;但如果事务回滚失效&#xff0c;可能会导致数据不一致的问题。我会用简单易懂的方式来讲解&#xff0c;帮助你理解事务回滚失效的常见原因及解决方法。 1. 什么是Spring事务回滚&#xff1f; 在Spring中&#xff0c;事务管理是…

中兴B863AV3.2-T/B863AV3.1-T2/B863AV3.1-T2K_电信高安_S905L3A-B_安卓9.0_线刷固件包

中兴B863AV3.2-T&#xff0f;B863AV3.1-T2&#xff0f;B863AV3.1-T2K_电信高安_S905L3A-B_安卓9.0_线刷固件包 B863AV3.2-T B863AV3.1-T2 已知可通刷贵州、江苏、贵州、北京、河南、陕西等省份。 线刷方法&#xff1a;&#xff08;新手参考借鉴一下&#xff09; 1、准备好一…