C语言—存储管理

在C语言中,存储管理是指分配、使用和释放内存的过程。C提供了几个标准库函数来处理动态内存分配,这对于创建灵活且高效的程序至关重要。理解C语言的存储管理主要涉及以下几个方面:

1. 动态内存分配函数

malloc(size_t size)

分配指定大小的未初始化内存。如果分配成功,返回指向内存的指针;如果失败,返回NULL。分配后,内存区域中的初始值是未定义的,通常是随机的或是之前留在那里的数据。由于不需要初始化内存,通常比 calloc 更快。

c 复制代码
int *arr = (int*)malloc(100 * sizeof(int));

calloc(size_t num, size_t size)

分配并初始化内存,用于分配数组。初始化所有位为0。如果分配了多个元素,calloc 会确保所有元素都被初始化为零。

c 复制代码
int *arr = (int*)calloc(100, sizeof(int));
c 复制代码
// 使用 malloc
int *arr1 = (int*)malloc(5 * sizeof(int));
// arr1 现在指向一块包含5个整数的内存,这些整数的值是未定义的

// 使用 calloc
int *arr2 = (int*)calloc(5, sizeof(int));
// arr2 现在指向一块包含5个整数的内存,这些整数的值都被初始化为0

realloc(void *ptr, size_t size)

重新分配之前通过 malloc 或 calloc 分配的内存区域。如果扩展内存,新部分未初始化。如果新的大小大于原始大小,新分配的内存部分将不会被初始化,如果新的大小小于原始大小,可能会丢失数据。如果 realloc 失败,原始内存区域仍然有效。

c 复制代码
#include <stdlib.h>

int main() {
    // 首先使用 malloc 分配内存
    int *arr = (int*)malloc(10 * sizeof(int)); // 分配10个整数大小的内存

    if (arr == NULL) {
        // 处理内存分配失败
    }

    // ...

    // 现在使用 realloc 改变内存大小
    arr = (int*)realloc(arr, 20 * sizeof(int)); // 重新分配为20个整数大小的内存

    if (arr == NULL) {
        // 处理内存重新分配失败
    }

    // ...

    // 释放内存
    free(arr);

    return 0;
}

free(void *ptr)

释放之前通过 malloc、calloc 或 realloc 分配的内存。

2. 栈和堆

栈(Stack)

用于存储局部变量和函数调用信息。栈内存由编译器自动管理,局部变量在其作用域结束时被销毁。

堆(Heap)

用于动态内存分配,由程序员显式管理。在堆上分配的内存需要使用 malloc、calloc 或 realloc 分配,并且应当使用 free 显式释放。

3.注意

  • 内存泄漏:忘记释放分配的内存会导致内存泄漏。确保为每个 malloc、calloc 或 realloc 调用匹配一个 free。
  • 空指针检查:在使用通过 malloc、calloc 或 realloc 返回的指针之前,总是检查它是否为 NULL。
  • 避免悬挂指针:释放内存后,将指针设置为 NULL,以避免悬挂指针(dangling pointer)。
  • 内存覆写:避免超出分配的内存范围进行写操作,这会导致未定义行为,可能破坏其他数据或引起程序崩溃。
相关推荐
多打代码5 小时前
2025.09.05 用队列实现栈 & 有效的括号 & 删除字符串中的所有相邻重复项
python·算法
黑客思维者6 小时前
《我是如何用C语言写工控系统的漏洞和Bug》连载(1)内容大纲
c语言·bug·工控漏洞
mit6.8246 小时前
并查集|栈
c++
中国胖子风清扬6 小时前
Rust 序列化技术全解析:从基础到实战
开发语言·c++·spring boot·vscode·后端·中间件·rust
j_xxx404_6 小时前
数据结构:栈和队列力扣算法题
c语言·数据结构·算法·leetcode·链表
南莺莺6 小时前
假设一个算术表达式中包含圆括号、方括号和花括号3种类型的括号,编写一个算法来判别,表达式中的括号是否配对,以字符“\0“作为算术表达式的结束符
c语言·数据结构·算法·
tuokuac7 小时前
Redis 的相关文件作用
数据库·redis·缓存
THMAIL7 小时前
深度学习从入门到精通 - 神经网络核心原理:从生物神经元到数学模型蜕变
人工智能·python·深度学习·神经网络·算法·机器学习·逻辑回归
野犬寒鸦7 小时前
力扣hot100:旋转图像(48)(详细图解以及核心思路剖析)
java·数据结构·后端·算法·leetcode
墨染点香7 小时前
LeetCode 刷题【61. 旋转链表】
算法·leetcode·职场和发展