C语言-内存管理

news/2025/1/24 10:10:26/

1、malloc()函数

        用于动态分配一块指定大小的内存,并返回指向这块内存的指针。如果分配失败,

        返回 NULL。 

int* ptr = (int*)malloc(sizeof(int) * 10);  // 分配一个包含 10 个整数的内存
if (ptr == NULL) {printf("Memory allocation failed!\n");
}

2、free() 函数

        用于释放之前通过 malloc()calloc()realloc() 分配的内存。释放内存后,

        指针仍然存在,但指向的内存不再有效。因此,通常会将指针设置为 NULL 以避免悬空指针。

free(ptr);  // 释放之前分配的内存
ptr = NULL;  // 防止使用悬空指针

3、内存溢出、内存越界

        内存存放的数据空间超过申请空间大小,操作超过申请空间大小。 

4、 内存泄漏

        如果分配的内存没有被及时释放,程序将消耗越来越多的内存,导致系统性能下降,

        甚至崩溃。这种现象被称为“内存泄漏”。

        为防止内存泄漏

                确保每次调用 malloc()后都要有相应的 free() 调用。

5、堆和栈的区别

        

1. 内存分配方式

  • 栈(Stack)

    • 内存的分配是自动管理的,遵循先进后出(LIFO)原则。
    • 当函数被调用时,相关的局部变量和参数会在栈上分配内存;当函数返回时,这部分内存会自动释放。
  • 堆(Heap)

    • 内存的分配是手动管理的,通过程序员调用特定的内存分配函数(如 malloc 或 new)。
    • 堆中的内存可以在程序的任何地方分配和释放,程序员需要显式释放使用 free 或 delete

2. 生命周期

    • 栈内存中的变量的生命周期仅限于它们被创建的函数调用,函数返回后,内存会自动释放。
    • 堆内存中的变量的生命周期是由程序员控制的,可以在需要时分配,直到显式释放为止。

3. 内存大小

    • 栈的大小通常是有限的,具体大小取决于操作系统和编译器的设置,通常为几 MB。
    • 堆的大小通常比栈大,受限于系统的可用内存。程序可以动态请求更大的内存块。

4. 存储内容

    • 存储的是函数的局部变量、参数、返回地址等临时数据。
    • 存储的是动态分配的对象和数据结构,如链表、树等,通常用于需要动态大小的情况。

5. 访问速度

    • 栈的访问速度较快,因为其分配和释放是简单的指针移动。
    • 堆的访问速度相对较慢,因为分配和释放需要更多的时间进行内存管理和找寻适合的内存块。

6. 错误处理

    • 栈溢出(stack overflow)可能导致程序崩溃,通常是在递归调用或分配太多局部变量时发生。
    • 堆溢出(memory leak)通常是由于未释放的内存,导致消耗过多内存,增加了程序崩溃的风险。

总结

栈和堆是内存管理中不可或缺的部分,各自适用于不同的场景。栈适合用于存储临时数据,速度快且管理简单,而堆适合存储大量不确定大小的动态数据,虽然需要更多的管理工作。了解它们的区别对于优化程序性能和避免内存问题至关重要。

      

http://www.ppmy.cn/news/1565754.html

相关文章

细说机器学习算法之过拟合与欠拟合

系列文章目录 第一章:Pyhton机器学习算法之KNN 第二章:Pyhton机器学习算法之K—Means 第三章:Pyhton机器学习算法之随机森林 第四章:Pyhton机器学习算法之线性回归 第五章:Pyhton机器学习算法之有监督学习与无监督…

机器学习实战第一天:LSTM(长短时记忆网络)

第一天是讲述LSTM大概的理论知识,知识是源自于B站李沐老师的讲解。下面我简单的总结一下LSTM的核心,因为文字不擅长表达过于细节的东西,如果有想深入了解LSTM的全部可以去B站搜索相关的视频讲解。 一、 LSTM具有很强的前后关联性&#xff0c…

Linux下 date时间应该与系统的 RTC(硬件时钟)同步

发现客户服务器时间与真实时间不同,并且服务器没有网络。 解决办法:时间应该与系统的 RTC(硬件时钟)同步 手动设置系统时间 使用 date 命令将系统时间设置为 2025年01月21日 14:12:00: sudo date --set"2025-01…

记录一次k8s起不来的排查过程

我在k8s集群,重启了一个node宿主机,竟然发现kubelet起不来了!报错如下 这个报错很模糊,怎么排查呢。这样,开两个界面,一个重启kubelet,一个看系统日志(/var/log/message:centos,/va…

【PoCL】运行 LLVM 中 pass 优化过程详解

PoCL 项目中调用 LLVM 的 Pass 对编译过程的优化至关重要。本博文以PoCL 开源项目源码为例,详细说明【PoCL】运行 LLVM 中 pass 优化过程 目录 0. 个人简介 && 授权须知1. pocl_llvm_run_pocl_passes 函数作用2. 禁止 “小网格 small grid” 工作组(workGroup)特化的…

【网络协议】RFC1350-TFTP协议

引言 TFTP(Trivial File Transfer Protocol)即简单文件传输协议,是一种轻量级的文件传输协议,它允许客户端从远程主机获取文件或将文件传输到远程主机,主要用于小文件的传输,特别是在需要简便性而非功能性和…

一分钟学习数据安全——白盒加密及安当应用

白盒加密作为一种先进的加密技术,在数据安全、通信安全和信息隐私保护等多个关键领域都有应用。这次的一分钟,让您快速了解一下白盒加密的概念,以及安当产品中的白盒加密应用。 一、什么是白盒加密 简单来说,白盒加密是一种特殊…

SVM模型(理论知识2)

目录 SVM模型函数间隔几何间隔 线性可分的SVM模型目标函数目标函数的等价转换拉格朗日乘子法基于拉格朗日乘子法的目标函数目标函数的求解 SVM模型 函数间隔 将图中五角星所代表的正例样本用1表示,将实心圆所代表的负例样本有-1表示;实体加粗直线表示某…