📜  运行时存储(1)

📅  最后修改于: 2023-12-03 15:28:18.702000             🧑  作者: Mango

运行时存储

在程序运行期间,程序所需要的数据都需要进行存储,这些存储位置可以是内存、硬盘等。其中,运行时存储指的是程序在运行期间所用到的数据,其存储在内存中,包括栈、堆、全局数据区、常量区等。

栈存放的数据主要是局部变量、函数参数、函数返回地址及临时变量等。它的存储方式为后进先出,栈顶指针向下移动,栈底指针不动。

栈的大小是由操作系统在程序运行前分配的,一般为2MB左右。如果栈空间使用过多,将会导致栈溢出的问题。

// 栈上分配内存示例
void test() {
    int a = 1; // a 存储在栈上
    if (a == 1) {
        int b = 2; // b 存储在栈上
    } // b 出了作用域,栈顶指针上移
} // a 出了作用域,栈顶指针上移

堆是由程序员在运行时动态分配内存的区域。堆中存放的数据可以被不同的线程使用。

堆的大小通常比较大,可以根据需要进行动态扩展。但是,由于堆中数据的不规则性和动态性,需要程序员手动管理堆空间,否则会导致内存泄漏或内存碎片的问题。

// 堆上分配内存示例
int *p = (int*)malloc(sizeof(int));
if (p == NULL) {
    // 分配内存失败
} else {
    // 使用 p 指向的内存空间
    *p = 10;
    // 释放 p 指向的内存
    free(p);
}
全局数据区

全局数据区是存放全局变量和静态变量的区域。全局变量和静态变量在程序运行期间都存在,其数据不会随着函数调用而销毁。

全局变量和静态变量在程序编译时就已经分配了内存,相当于在编译器分配了一块内存空间,并在程序运行时初始化。

// 全局数据区示例
int a; // a 存储在全局数据区
static int b; // b 存储在全局数据区
int main() {
    // a 和 b 可以在主函数中直接访问
    a = 1;
    b = 2;
    return 0;
}
常量区

常量区是存放常量的区域,如字符串常量、const修饰的全局常量等。常量区数据在程序运行期间不可修改,其地址固定。

// 常量区示例
const char *str = "hello, world"; // str 存储在常量区
int main() {
    // str 保存的地址为常量区地址
    printf("%s\n", str);
    return 0;
}
总结

运行时存储包括栈、堆、全局数据区、常量区等,程序员在编写程序时需要正确使用这些存储区域来存储程序所需要的数据。同时,需要注意内存管理的问题,防止内存泄漏、内存碎片等问题的出现。