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;

}

现在,让我们详细解释每个变量和数据在内存中的位置:

  1. GlobalVar

    • 类型:全局变量
    • 位置:数据段(静态区)
    • 原因:全局变量在程序开始时初始化并存放在数据段,直到程序结束才被释放。
  2. StaticglobalVar1

    • 类型:静态全局变量
    • 位置:数据段(静态区)
    • 原因:静态全局变量与普通全局变量类似,存放在数据段,生命周期贯穿整个程序运行期间。
  3. staticglobalVar2

    立即学习“C++免费学习笔记(深入)”;

    • 类型:静态局部变量
    • 位置:数据段(静态区)
    • 原因:静态局部变量在程序开始时初始化并存放在数据段,生命周期也贯穿整个程序运行期间。
  4. partVar

    • 类型:局部变量
    • 位置:栈区
    • 原因:局部变量在函数调用时分配在栈区,函数结束时自动释放。
  5. arr

    • 类型:局部数组
    • 位置:栈区
    • 原因:局部数组在函数调用时分配在栈区,函数结束时自动释放。
  6. str1

    • 类型:动态分配的内存指针
    • 位置:堆区(指向的内存),栈区(指针本身)
    • 原因:malloc函数在堆区分配内存,str1本身是一个指针,存放在栈区。
  7. str2

    • 类型:动态分配的内存指针
    • 位置:堆区(指向的内存),栈区(指针本身)
    • 原因:与str1相同,malloc在堆区分配内存,str2本身存放在栈区。
  8. 字符串常量 "abcdef"

    • 类型:字符串常量
    • 位置:数据段(静态区)
    • 原因:字符串常量在编译时被存放在数据段。
  9. 代码段

    • 位置:代码段
    • 原因:包含main函数的二进制代码。

总结:

  • 数据段(静态区)GlobalVar, StaticglobalVar1, staticglobalVar2, 字符串常量 "abcdef"
  • 栈区partVar, arr, str1(指针本身), str2(指针本身)
  • 堆区str1(指向的内存), str2(指向的内存)
  • 代码段main函数的二进制代码

c/c++中内存空间区域划分划分

网友留言(0 条)

发表评论