资料合集下载链接:
https://pan.quark.cn/s/472bbdfcd014
在C语言编程中,内存管理是每一个开发者都必须掌握的核心技能。我们知道,函数内的局部变量存储在**栈(Stack)**上,它们随着函数的调用而生,随函数的返回而亡,生命周期短暂且由编译器自动管理。
但如果我们需要一种“更持久”的数据,希望它在创建它的函数执行结束后依然存在,该怎么办?这时,**堆(Heap)**就闪亮登场了。
这篇博客将带你深入理解C语言中堆区内存的使用,掌握其从开辟、使用到释放的完整生命周期,让你能够自信地驾驭动态内存。
一、 为什么需要堆区?数据的持久化需求
想象一个场景:你编写了一个函数,用于从用户输入中创建一个数组。你希望这个函数能返回创建好的数组,以便在程序的其他地方使用。
如果像下面这样在函数内创建一个普通数组并返回其地址,会发生什么?
#include <stdio.h>
int* create_array_on_stack() {
int arr[5] = {10, 20, 30, 40, 50};
printf("函数内: 数组 arr 的地址是 %p\n", arr);
return arr; // 警告:返回局部变量的地址
}
int main() {
int* p = create_array_on_stack();
printf("函数外: 指针 p 指向的地址是 %p\n", p);
// 尝试访问数据,结果是未定义的!
printf("函数外: 访问 p[0] = %d\n", p[0]);
return 0;
}