程序代码篇---C/C++中的变量存储位置


文章目录


前言

在 C/C++ 中,变量的存储位置 直接影响其生命周期、作用域和访问方式 。以下是主要存储区域及其示例代码:


1. 栈(Stack)

特点

特点:自动分配/释放 ,函数局部变量、参数 等,速度快但空间有限(通常几MB)

生命周期

生命周期:函数调用开始到结束

示例

c 复制代码
void foo() {
    int a = 10;          // 栈上分配
    char buffer[1024];   // 栈上数组
}

2. 堆(Heap)

特点

特点:手动分配/释放 (malloc/free 或 new/delete ),空间大但需管理

生命周期

生命周期:从分配直到显式释放

示例

c 复制代码
// C 风格
int *p1 = (int*)malloc(sizeof(int));  // 堆分配
free(p1);
c++ 复制代码
// C++ 风格
int *p2 = new int;       // 堆分配
delete p2;

3. 静态区(Static/Global 区)

a. 已初始化数据段(.data 段)

特点

特点:显式初始化的全局变量、静态变量

生命周期

生命周期:程序启动到结束

示例

c 复制代码
int global_var = 42;      // 全局变量,.data 段

void func() {
    static int static_local = 10;  // 静态局部变量,.data 段
}

b. 未初始化数据段(.bss 段)

特点

特点:未显式初始化的全局变量、静态变量(默认初始化为0)

示例

c 复制代码
int global_uninit;        // .bss 段(初始化为0)

void func() {
    static int static_uninit;  // .bss 段(初始化为0)
}

4. 文字常量区(常量区)

特点

特点:存放字符串常量和 const 常量(只读)

生命周期

生命周期:程序启动到结束

示例

c 复制代码
const char* str = "Hello";  // "Hello" 在常量区,str 自身可能在栈或静态区
const int MAX = 100;        // 可能被编译器优化到常量区或直接内联

5. 代码区(Text Segment)

特点

特点:存放程序的可执行指令(如函数体代码)

示例

python 复制代码
void some_function() {  // 函数体的**机器码**存放在代码区
    // ...
}

6. 线程局部存储(Thread-Local Storage, TLS)

特点

特点:每个线程独立的变量(C11/C++11 起支持 _Thread_local 或 thread_local)

示例

c 复制代码
#include <threads.h>
_Thread_local int tls_var;  // 每个线程独立实例

7.综合示例代码

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

// 静态区(.data 段)
int global_initialized = 10;

// 静态区(.bss 段)
int global_uninitialized;

void func() {
    // 栈变量
    int local_stack = 20;

    // 静态局部变量(.data 或 .bss 段)
    static int static_local = 30;

    // 堆分配
    int* heap_var = (int*)malloc(sizeof(int));
    *heap_var = 40;
    free(heap_var);
}

int main() {
    // 栈变量
    int a = 50;

    // 堆分配
    int* b = (int*)malloc(sizeof(int));
    *b = 60;

    func();

    // 常量区
    const char* str = "Constant String";

    free(b);
    return 0;
}

8.关键区别总结

存储区 分配方式 生命周期 典型用途

栈 自动 函数调用期间 局部变量、参数

堆 手动(new/malloc) 显式释放前 动态数据结构

静态区 编译器 程序运行期间 全局变量、静态变量

文字常量区 编译器 程序运行期间 字符串常量、const

代码区 编译器 程序运行期间 可执行指令

理解这些区域有助于避免内存泄漏、悬垂指针等问题,并优化程序性能。


总结

以上就是今天要讲的内容,本文仅仅简单介绍了C/C++中的不同变量存储位置下的变量的分配方式、生命周期、典型用途。

相关推荐
A7bert7773 分钟前
【MobileSAM部署至RK3588】环境适配→转换RKNN→开发板部署
c++·人工智能·深度学习·目标检测·ubuntu
青少儿编程课堂19 分钟前
蓝桥杯·全国青少年信息素养大赛·电子学会C/C++考级:分层图最短路解析
c++·python·算法·bfs·信息学竞赛
FlightYe11 小时前
视界原理之3D视频(四):裸眼、眼镜和头显
android·linux·c++·3d·ffmpeg·音视频
蹊黎11 小时前
Linux 下用 C 语言实现进度条
linux·c语言·单片机
by2099912 小时前
C++ 智能指针的所有权与使用
开发语言·c++·经验分享
Rover Ramble12 小时前
C++ 用互斥锁实现读写锁
开发语言·c++
你怎么知道我是队长13 小时前
C++零基础入门第2周:数据类型、运算符与表达式完全指南(附20段可运行代码+避坑清单)
c++
say_fall13 小时前
【Linux系统编程】Ext 文件系统:磁盘与存储、文件与目录、现代计算机究竟如何寻找文件
linux·运维·服务器·数据库·c++
雪落漂泊13 小时前
C++算法 滑动窗口篇(下)
开发语言·c++
爱聊灵光的维C13 小时前
从看见世界到重构认知:在视觉与硬件的交汇处,寻找我们这代人的北极星
c语言·物联网·计算机视觉·重构·硬件工程·射频工程