C/C++内存空间区域划分详解
在C/C++中,内存空间区域划分为多个不同的部分,包括栈区(存放局部变量和函数调用的临时数据)、堆区(动态分配内存空间)、全局/静态存储区(存放全局变量和静态变量)以及代码区(存放程序的机器代码),这些区域各司其职,共同构成了程序的内存空间,栈区和堆区的管理是程序员需要特别关注的,因为不当的内存管理可能导致程序出错甚至崩溃。
让我们逐一分析代码中的变量和数据,确定它们在内存中的位置:

#include#include int GlobalVar = 1; // 数据段(静态区) static int StaticglobalVar1 = 1; // 数据段(静态区)
int main() { static int staticglobalVar2 = 1; // 数据段(静态区) int partVar; // 栈区 char arr[] = "abcdef"; // 栈区 int str1 = (int)malloc(sizeof(int) 5); // 堆区 int str2 = (int)malloc(sizeof(int) 5); // 堆区
if (str1 == NULL || str2 == NULL) { perror("malloc()"); return 1; } free(str1); // 释放堆区内存 free(str2); // 释放堆区内存 str2 = NULL; // 栈区(指针本身) str1 = NULL; // 栈区(指针本身) return 0;}
现在,让我们详细解释每个变量和数据在内存中的位置:
GlobalVar:
- 类型:全局变量
- 位置:数据段(静态区)
- 原因:全局变量在程序开始时初始化并存放在数据段,直到程序结束才被释放。
StaticglobalVar1:
- 类型:静态全局变量
- 位置:数据段(静态区)
- 原因:静态全局变量与普通全局变量类似,存放在数据段,生命周期贯穿整个程序运行期间。
staticglobalVar2:
立即学习“C++免费学习笔记(深入)”;
- 类型:静态局部变量
- 位置:数据段(静态区)
- 原因:静态局部变量在程序开始时初始化并存放在数据段,生命周期也贯穿整个程序运行期间。
partVar:
- 类型:局部变量
- 位置:栈区
- 原因:局部变量在函数调用时分配在栈区,函数结束时自动释放。
arr:
- 类型:局部数组
- 位置:栈区
- 原因:局部数组在函数调用时分配在栈区,函数结束时自动释放。
str1:
- 类型:动态分配的内存指针
- 位置:堆区(指向的内存),栈区(指针本身)
- 原因:
malloc函数在堆区分配内存,str1本身是一个指针,存放在栈区。str2:
- 类型:动态分配的内存指针
- 位置:堆区(指向的内存),栈区(指针本身)
- 原因:与
str1相同,malloc在堆区分配内存,str2本身存放在栈区。字符串常量 "abcdef":
- 类型:字符串常量
- 位置:数据段(静态区)
- 原因:字符串常量在编译时被存放在数据段。
代码段:
- 位置:代码段
- 原因:包含
main函数的二进制代码。总结:
- 数据段(静态区):
GlobalVar,StaticglobalVar1,staticglobalVar2, 字符串常量 "abcdef"- 栈区:
partVar,arr,str1(指针本身),str2(指针本身)- 堆区:
str1(指向的内存),str2(指向的内存)- 代码段:
main函数的二进制代码
下一篇 >>

网友留言(0 条)