【C语言入门】内存布局:栈(局部变量)、堆(动态分配)、数据段(全局/静态)、代码段

【C语言】内存区域划分及分配及变量知识总结(全局变量、局部变量) 一、内存区域划分与分配: 1、栈区(stack)——程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等,程序结束时由编译器自动释放。 2、堆区(heap)——在内存开辟另一块存储区域。一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。用malloc, calloc, realloc等分配内存的函数分配得到的就是在堆上。 3、全局区(静态区)(static)——... 阅读详情

引言:为什么要懂内存布局?

C 语言被称为 “接近底层的高级语言”,核心优势是直接操作内存。但如果不理解内存布局,写程序时可能遇到各种 “玄学问题”:

  • 局部变量突然被 “篡改”(栈溢出);
  • malloc后忘记free,程序越跑越慢(内存泄漏);
  • 修改常量字符串导致崩溃(段错误)。
    理解内存布局,相当于拿到了 “程序的地图”,能让你更高效地调试、优化代码,甚至写出更安全的系统级软件(如操作系统、嵌入式程序)。
1. C 程序的内存布局:从 “虚拟地址空间” 说起

现代操作系统(如 Linux、Windows)为每个程序分配了独立的 “虚拟地址空间”(32 位系统 4GB,64 位系统更大)。这个空间被划分为几个固定区域,分别对应代码段、数据段、堆、栈,以及其他辅助区域(如命令行参数、环境变量)。

2. 代码段(Text Segment):程序的 “操作手册”
2.1 定义与特点

代码段(又称.text段)是内存中只读且可执行的区域,存储程序的机器指令(CPU 实际执行的二进制代码)和常量数据(如字符串字面量、数值常量)。

关键特性:

  • 只读:防止程序意外修改自身代码(比如手滑写了"hello"[0]='H',会触发 “段错误”)。
  • 可执行:CPU 从这里读取指令并执行(操作系统通过 “NX 位” 标记该区域是否可执行,防止缓冲区溢出攻击)。
2.2 存储内容
  • 机器指令:编译器将 C 代码编译为二进制指令(如add、mov),存储在此处。
  • 字符串字面量:如char* str = "hello";中的"hello",存储在代码段(注意:str变量本身是局部变量,存在栈里,只是它指向代码段的字符串)。
  • 数值常量:如const int a=10;(注意:C 语言中const变量默认存数据段,除非用static const修饰,可能被优化到代码段)。
2.3 示例与验证
#include <stdio.h>

int main() {
    char* str = "hello"; // "hello"在代码段
    printf("%p\n", str); // 打印字符串地址
    return 0;
}

编译后运行(Linux 下用gcc test.c -o test),用objdump -t test查看符号表,会发现"hello"的地址落在.text段范围内。

3. 数据段(Data Segment):程序的 “仓库”

数据段是存储全局变量和静态变量的区域,分为两个子段:.data段(已初始化数据)和.bss段(未初始化数据)。

3.1 .data 段:“已初始化的仓库”

存储已初始化的全局变量和静态变量。
示例:

int global_init = 10; // 全局已初始化,.data段
static int static_init = 20; // 静态已初始化,.data段

特点:

  • 程序启动时由操作系统分配内存,初始值为代码中指定的值。
  • 在可执行文件(如.exe、.elf)中占空间(因为需要保存初始化值)。
3.2 .bss 段:“未初始化的仓库”

存储未初始化的全局变量和静态变量(默认初始化为 0)。
示例:

int global_uninit; // 全局未初始化,.bss段(默认0)
static int static_uninit; // 静态未初始化,.bss段(默认0)

特点:

  • 程序启动时分配内存,初始值为 0(无需在可执行文件中保存数据,仅记录大小,节省空间)。
  • 若全局变量显式初始化为 0(如int global_zero=0;),编译器可能将其优化到.bss段(因为 0 是默认值)。
3.3 全局变量 vs 静态变量
特性全局变量静态变量(文件内 static)函数内 static 变量
作用域整个程序(其他文件用 extern 声明可访问)本文件内本函数内
生命周期程序启动到结束程序启动到结束程序启动到结束
存储位置.data(已初始化)或.bss(未初始化).data(已初始化)或.bss(未初始化).data(已初始化)或.bss(未初始化)
3.4 验证:查看.data 和.bss 大小

Linux 下编译程序后,用size test命令可以看到各段大小:

   text    data     bss     dec     hex filename
   1234    567      890    2691    a83 test

其中data是.data段大小,bss是.bss段大小。

4. 栈(Stack):函数的 “临时舞台”

栈是内存中向下增长(向低地址方向)的区域,用于存储函数调用相关数据(局部变量、函数参数、返回地址、栈帧指针)。

4.1 栈的工作原理:后进先出(LIFO)

当函数被调用时,CPU 会执行以下操作(以 x86 架构为例):

  1. 压栈(Push):将函数参数(从右到左)、返回地址(调用函数的下一条指令地址)、旧栈帧指针(ebp)压入栈。
  2. 分配局部变量空间:调整栈顶指针(esp),为局部变量腾出空间。
  3. 执行函数体:使用栈中的局部变量和参数。
  4. 弹栈(Pop):函数结束时,恢复栈顶指针(释放局部变量),弹出旧栈帧指针和返回地址,跳回调用函数。
4.2 栈帧结构:函数的 “专属空间”

每个函数在栈中对应一个 “栈帧”(Stack Frame),包含:

  • 参数区:函数参数(如int func(int a, int b)中的a和b)。
  • 返回地址:调用该函数的下一条指令地址(函数执行完后跳回这里)。
  • 帧指针(ebp):指向当前栈帧的起始位置(用于定位局部变量和参数)。
  • 局部变量区:函数内定义的局部变量(如int c = a + b;中的c)。
4.3 局部变量的 “临时” 本质

局部变量的生命周期仅为函数调用期间。函数结束后,栈帧被销毁,局部变量的内存被回收(但内存中的数据不会被立即清空,只是 “标记为可用”)。因此,绝不能返回局部变量的地址:

int* get_num() {
    int num = 10; // num在栈中,函数结束后被回收
    return &num; // 危险!返回了已失效的地址
}

调用get_num()后,指针指向的内存可能被其他函数覆盖,导致不可预期的错误。

4.4 栈溢出:“餐盘堆太高会塌”

栈的大小是有限的(Linux 默认约 8MB,可通过ulimit -s查看)。如果局部变量太大(如int arr[1000000];)或函数递归过深(如无限递归),会导致栈溢出(Stack Overflow),程序崩溃(核心转储)。

5. 堆(Heap):动态内存的 “自由市场”

堆是内存中向上增长(向高地址方向)的区域,用于存储动态分配的内存(通过malloc、calloc、realloc申请)。

5.1 为什么需要堆?

栈的局限性:

  • 大小固定(不能存太大数据);
  • 生命周期固定(函数结束即回收)。
    堆的优势:
  • 动态分配(需要多少申请多少);
  • 生命周期可控(手动释放,可跨函数使用)。
5.2 动态内存分配函数
函数作用示例
malloc(size_t size)申请size字节的连续内存(初始值随机)int* p = malloc(10*sizeof(int));(申请 40 字节)
calloc(size_t num, size_t size)申请num个size字节的内存(初始化为 0)int* p = calloc(10, sizeof(int));(等价于malloc+memset)
realloc(void* ptr, size_t new_size)调整已分配内存的大小(可能移动位置)p = realloc(p, 20*sizeof(int));(扩大到 80 字节)
free(void* ptr)释放已分配的内存(必须由malloc等函数返回的指针)free(p); p=NULL;(避免野指针)
5.3 堆的管理机制:操作系统与内存分配器

堆的底层由操作系统(如 Linux 的brk/sbrk系统调用)管理,但直接调用系统调用效率低,因此 C 标准库(如 glibc)实现了内存分配器(如 ptmalloc2),负责:

  • 空闲块管理:用链表记录空闲内存块(如隐式链表、显式链表)。
  • 合并与分割:释放内存时合并相邻空闲块(减少碎片);分配时分割大空闲块(提高利用率)。
  • 内存对齐:保证分配的内存地址符合 CPU 访问要求(如 x86 要求 4 字节对齐,x86_64 要求 8 字节对齐)。
5.4 常见堆操作错误
  • 内存泄漏(Memory Leak):申请内存后未free,导致内存逐渐被占满(长期运行的程序如服务器易受影响)。
  • 野指针(Dangling Pointer):释放内存后仍使用指针(或指针未置NULL,再次访问已释放的内存)。
  • 越界访问:写入超过分配内存的范围(如malloc(10)后写入第 11 个字节),导致堆块 metadata 被破坏(“堆腐败”)。
6. 内存布局的实际观察:工具与技巧

要深入理解内存布局,可以通过以下工具 “亲眼看到” 各区域的位置:

6.1 objdump:查看可执行文件的段信息

Linux 下用objdump -h test查看可执行文件的段头部,会显示.text(代码段)、.data(已初始化数据段)、.bss(未初始化数据段)的大小和偏移量。

6.2 gdb:调试时查看变量地址

在 gdb 中运行程序,用p &变量名打印地址,根据地址范围判断所在段:

  • 代码段地址较低(如 0x400000 左右);
  • 数据段地址较高(如 0x600000 左右);
  • 堆地址在数据段之上(动态分配,每次运行可能不同);
  • 栈地址最高(如 0x7fffffff 左右,向下增长)。
6.3 /proc/self/maps:查看进程的内存映射

Linux 下运行程序时,cat /proc/self/maps会显示进程的内存区域分布,包括各段的起始地址、权限(如r-xp表示只读可执行,对应代码段;rw-p表示可读可写,对应数据段、堆、栈)。

7. 扩展:内存布局的 “边界情况” 与注意事项
7.1 常量字符串的存储位置

C 语言中,char* str = "hello";的"hello"是字符串字面量,存储在代码段(只读)。如果尝试修改str[0]='H',会触发段错误(因为代码段不可写)。

7.2 const变量的存储位置

C 语言的const变量只是 “只读”,本质还是变量,默认存储在数据段(可通过指针修改,尽管这是未定义行为)。例如:

const int a = 10; // 存.data段
int* p = (int*)&a;
*p = 20; // 可能成功(取决于编译器优化),但强烈不建议!

若用static const修饰,编译器可能将其优化到代码段(不可修改)。

7.3 多线程程序的栈

每个线程有独立的栈(避免线程间数据干扰),但共享堆、数据段、代码段。因此,多线程程序中局部变量是线程安全的,而全局变量需要加锁保护。

7.4 嵌入式系统的内存布局

嵌入式系统资源有限(如只有几十 KB 内存),内存布局可能更紧凑(甚至代码段和数据段重叠)。此时需要严格控制全局变量和堆的使用,避免栈溢出。

8. 总结:内存布局是 C 语言的 “骨骼”

理解内存布局(栈、堆、数据段、代码段)是 C 语言编程的核心能力。它能帮助你:

  • 避免内存错误(如栈溢出、内存泄漏);
  • 优化内存使用(如用局部变量替代全局变量,减少堆分配);
  • 调试复杂问题(如通过地址判断变量所在段,定位错误)。

用 “餐厅比喻” 理解内存布局

咱们把计算机的内存想象成一家超大型餐厅,里面有四个 “功能区”,分别对应 C 语言的栈、堆、数据段、代码段。你可以把写程序比作在餐厅里招待客人,不同的 “物品”(变量、代码)要放在不同的区域,方便管理。

1. 栈(Stack):临时餐盘区 —— 用完就收

特点:像餐厅里叠放的餐盘,每次用新餐盘只能从最上面拿(后进先出),用完的餐盘也必须放回最上面。
对应 C 语言:函数里的局部变量(比如你在main()里定义的int a=10)就存这里。
为什么?
当你调用一个函数(比如void eat()),就像餐厅来了一桌客人,需要临时拿几个餐盘(局部变量)。客人吃完(函数执行完),餐盘必须立刻收走(局部变量被销毁),腾出位置给下一桌。
关键记忆点:

  • 自动分配 / 释放,不用你操心(编译器管)。
  • 空间小(像餐盘数量有限),不能存太大的东西(比如定义int arr[1000000]可能 “压垮” 栈,导致崩溃)。
2. 堆(Heap):自助取餐区 —— 自己占位置

特点:像餐厅的自助区,没有固定位置,你得自己找地方放东西(甚至可以 “占” 一大片),用完后要自己收拾(不然地方会被占满)。
对应 C 语言:用malloc()/calloc()动态申请的内存(比如int* p = malloc(10*sizeof(int)))就存这里。
为什么?
如果你需要存的数据大小不确定(比如用户输入的数组长度),或者需要跨函数使用(比如在 A 函数申请,B 函数用),栈的 “临时餐盘” 不够用,就得去堆区 “占位置”。
关键记忆点:

  • 手动分配 / 释放(你得自己用free()收拾,不然会 “内存泄漏”,餐厅越来越挤)。
  • 空间大(像自助区可以扩展),但管理麻烦(可能出现 “碎片”,比如中间有空位但没法放太大的东西)。
3. 数据段(Data Segment):仓库 —— 长期存放

特点:像餐厅的仓库,专门放长期需要的食材(比如盐、糖、油),不管有没有客人,这些东西都得一直备着。
对应 C 语言:全局变量(比如int global_num=100;)和静态变量(比如static int static_num=200;)存这里。
为什么?
全局变量从程序启动到结束都要存在(比如记录程序运行次数),静态变量虽然只能在一个函数里用,但也需要 “活” 到程序结束(比如函数里的static int count=0,每次调用都会保留上次的值)。
关键记忆点:

  • 分两小类:
    • .data段:存已初始化的全局 / 静态变量(比如int a=10)。
    • .bss段:存未初始化的全局 / 静态变量(比如int b;,默认值是 0,且不占可执行文件空间)。
4. 代码段(Text Segment):菜单 —— 只读且固定

特点:像餐厅的菜单,上面写好了做菜的步骤(“煎蛋要先倒油”“炒饭要翻炒 3 分钟”)。菜单一旦印好就不能改(改了会被客人投诉),而且所有厨师(CPU)都按菜单操作。
对应 C 语言:程序的代码(比如printf("hello");)和常量(比如"hello"字符串、3.14这样的数字)存这里。
为什么?
代码是程序的 “操作指令”,必须保证安全(不能被意外修改),所以代码段是只读且可执行的。常量(比如char* str="hello"中的"hello")也存在这里,因为它们不能被修改(改了会报 “段错误”)。

总结表格(一图胜千言)
内存区域类比餐厅存储内容管理方式关键特点
代码段菜单代码指令、常量(如 "hello")编译器生成,只读不能改,程序运行的 “操作手册”
数据段仓库全局变量、静态变量(已初始化 /.data;未初始化 /.bss)程序启动时分配,结束时释放长期存在,占内存
栈临时餐盘区局部变量、函数参数、返回地址函数调用时自动压栈,结束时弹栈空间小,速度快,后进先出
堆自助取餐区动态分配的内存(malloc/calloc)手动分配(malloc)、手动释放(free)空间大,灵活,但易泄漏

 

C程序设计语言--变量在内存中的分布 堆、栈、数据段、bss段、文本段 为了弄清楚这个问题,先看看在C语言中变量的分类首先查看这篇文章。 一、linux的进程内存分布   1)主要是由从小到大的地址空间分布,从低地址到高地址依次是:文本段(text),数据段,BSS段,堆,栈。 文本段:文本段中存放的是代码,只读数据,字符串常量(我们通常说保存在文字常量中,实际就是在文本段)数据段:数据段用来存放可执行文件中已经初始化的全局变量,全局变量又可细分为全 阅读详情

相关推荐

C语言的代码内存布局详解

一个程序本质上都是由 BSS 段、data段、text段三个组成的。这样的概念在当前的计算机程序设计中是很重要的一个基本概念,而且在嵌入式系统的设计中也非常重要,牵涉到嵌入式系统运行时的内存大小分配,存储单元占用空间大小的问题。 BSS段:在采用段式内存管理的架构中,BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Starte

SCOTT 技术博客 2652

堆栈段、数据段、代码段

malloc在内存的动态存储区中分配一个长度为size字节的连续空间,其参数是无符号整型,返回一个指向所分配的连续空间的起始地址的指针。注意:程序加载运行时,.rodata段和.text段通常合并到一个Segment(Text Segment)中,操作系统将这个Segment的页面只读保护起来,防止意外的改写。4)用const修饰的全局变量是放入常量区的,但是使用const修饰的局部变量只是设置为只读起到防止修改的效果,没有放入常量区。并不给该段的数据分配空间,只是记录数据所需空间的大小。

adsd14654的博客 1万+

C和C++的内存布局

1.1 内存分布图 Stack段:局部变量存放区域。 heap段:用户动态分配内存区域。 bss段:存放未初始化的全局或静态变量内存区域。(Block Started by Symbol) 数据段:通常指存放已初始化的全局变量的内存区域。(data segment) 代码段:通常指存放程序执行代码的一块内存区域。(code segment/text segment) 1.2 在C中分为5个存储区...

c+c++的博客 1639

C语言程序里全局变量、局部变量、堆、栈等概念及内存地址分配

文章目录一、c语言内存分配二、ubuntu系统中编程,输出信息进行验证二、使用步骤1.引入库2.读入数据总结 一、c语言内存分配 一,内存分配 1,内存分配的类型: 在C/C++中内存分为5个区,分别为栈区、堆区、全局/静态存储区、常量存储区、代码区。 静态内存分配:编译时分配。包括:全局、静态全局、静态局部三种变量。 动态内存分配:运行时分配。包括:栈(stack): 局部变量。堆(heap): c语言中用到的变量被动态的分配在内存中。(malloc或calloc、realloc、free函数) 2..

aiwr_的博客 2875

【C语言】内存布局大揭秘 ! -《堆、栈和你从未听说过的内存角落》

“C语言内存布局大揭秘:堆、栈和你从未听说过的内存角落”

LuckiBit 1555

类银河恶魔城学习记录1-1 Player状态机的搭建 P28

什么是状态机?一篇文章就够了 - 知乎说实话,目前并不能深入理解状态机的奇妙之处(当然,我觉得状态机作为教程的重要组成部分是不得不理解的,所以以下我会对游戏教程内的状态机做一些我认为的解释,如有错误,请多包涵)

Homura_的博客 2340

C语言的5个内存段你了解吗?嵌入式中的堆栈你熟悉吗?( 代码段/数据段/栈/堆)

这些内存段在程序运行时起着不同的作用,有不同的分配方式和存储内容。对于 C 语言程序员来说,了解这些内存段的特性和用途有助于更好地理解内存管理、变量的存储位置以及程序执行过程中的内存分配情况。

吻等离子的博客 3148

微信小程序如何转云开发

小程序转云开发

zhangxiaobai___的博客 3914

嵌入式 C 编程必备(1):清晰区分数据段、代码段、堆、栈段和 BSS 段

在嵌入式开发中,进程内存空间包含五种数据区:代码区存储只读指令,数据区存储已初始化全局/静态变量,BSS段存储未初始化全局/静态变量(程序执行前自动初始化为零),堆区用于动态内存分配,栈区存储局部变量、调用参数及返回地址,由操作系统自动管理,各数据区共同支持程序执行。

byte轻骑兵的技术小窝 7145

用Python和NumPy可视化理解波函数:从概率密度到薛定谔方程的可视化教程

本文通过Python和NumPy实现量子力学波函数的可视化,从概率密度到薛定谔方程的动态演化,帮助读者直观理解量子态的特性。教程涵盖无限深势阱、量子谐振子等模型,结合代码示例展示时间演化和期望值计算,为量子力学学习提供实用工具。

weixin_27303545的博客 226

从Jira到Notion:用Sequential Thinking重构你的敏捷工作流(含GPT-6配置模板)

本文探讨了如何利用Sequential Thinking这一AI认知模型,重构敏捷开发工作流。通过连接Jira、Notion等工具,构建动态依赖图谱,实现从被动响应到主动规划的转变。文章提供了详细的配置教程和GPT-6配置模板,帮助团队实现任务自动拆解、智能看板生成与跨平台协调,从而提升项目管理效率。

gpt4scribbler的博客 205

C语言进程内存映像(堆、栈、数据段、代码段)

C语言进程内存映象

m0_63939847的博客 1192

S/4中的16种特殊库存类型

S/4中的16种特殊库存类型

yanzibing99的博客 1万+

C语言代码内存空间布局:堆(heap)、栈(stack)、bss段、数据段(data段),文本段(代码段)

C语言代码内存空间布局:堆(heap)、栈(stack)、数据段(datad段)、bss段、文本段(代码段)

仰望星空,脚踏实地的博客 2324

电价预测的Transformer实战:从注意力机制到超长序列建模

本文深入探讨了Transformer模型在电价预测领域的实战应用,对比了其与LSTM在处理长序列依赖和误差累积问题上的优劣。文章详细解析了自注意力机制的原理,并提供了处理超长序列的位置编码方法、构建专用预测模型的完整PyTorch代码,以及防止信息泄露的关键技巧。通过实战对比,展示了Transformer在并行计算、长距离建模和预测精度上的显著优势,并分享了应对极端波动和提升模型效率的高级优化策略。

f6g7h8i9j的博客 541

正点原子stm32f103RChal库制作数字秒表:如用keil5和正点原子STM32F1开发板实现?

🏆本文收录于 《全栈Bug调优(实战版)》 专栏,该专栏专注于分享我在真实项目开发中遇到的各类疑难Bug及其深层成因,并系统提供高效、可复现的解决思路和实操方案。无论你是刚入行的新手开发者,还是拥有多年项目经验的资深工程师,本专栏都将为你提供一条系统化、高质量的问题排查与优化路径,助力你加速成长,攻克技术壁垒,迈向技术价值最大化与职业发展的更高峰🚀!    📌 特别说明: 文中部分技术问题来源于真实生产环境及网络公开案例,均经过精挑细选与系统化整理,并结合多位一线资深架构师和工程师多年实战经验沉淀,提

**My Coding Family** 1265

C语言中的内存布局:代码段、数据段、堆、栈

本文详细介绍了C语言程序的内存布局,主要分为四个关键区域:代码段(存储可执行指令)、数据段(存放全局和静态变量)、堆(动态分配内存区域)和栈(管理函数调用和局部变量)。文章通过代码示例和图表展示了各区域的特点:代码段是只读共享的,数据段分为初始化区和未初始化区,堆需要手动管理内存分配释放,而栈则自动管理函数调用。特别强调了堆和栈的增长方向相反(堆向上、栈向下),并指出了常见的内存使用错误,如返回局部变量指针的危险性。理解这些内存区域的特性对编写高效、安全的C程序至关重要。

always_TT的博客 388

爬取B站评论+AI情感分析:Python批量抓数据+BERT正负向分类(全流程)

B站作为年轻群体聚集的内容平台,评论区蕴含海量用户真实态度(如好评、吐槽、中立观点),是情感分析的优质数据源!本文分享完整流程:批量爬取B站视频评论→数据清洗去噪→BERT模型情感分类→可视化分析,基于预训练BERT模型实现高精度正负向判断,新手也能快速复刻情感分析系统! 前置配置(关键!获取B站API访问权限) B站评论通过官方API接口返回,无需复杂解析,只需配置用户Cookie即可正常请求: 2. 完整代码(直接复制运行) 三、使用步骤(5步搞定,新手友好) 步骤1:配置关键参数 打开,在类中修改

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1069

数据段、代码段、堆、栈详解

原文:https://blog.youkuaiyun.com/weixin_38233274/article/details/80321719 BSS段:BSS段(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 数据段:数据段(data segment)通常是指用来存放程序中已初始化的...

Colorful_lights的博客 3021

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

C 语言内存布局深度剖析:从栈到堆,你真的了解吗?

想象一下,你搬进了一栋新公寓,却不知道卧室、厨房、卫生间分别在哪儿...每天早上找个马桶都跟玩密室逃脱似的,是不是很崩溃?C 语言内存就像你的"数字公寓",不了解它的布局,代码写着写着就容易"走错房间",结果就是 —— 程序崩溃,电脑蓝屏,领导白眼...看完是不是觉得豁然开朗?栈区:餐桌,用完自动收拾堆区:储物间,需要自己管理全局区:固定家具,一直都在代码段:房屋结构,不能随便改掌握这些概念,你写 C 语言代码时就能心中有数,不再像无头苍蝇乱撞。

xuxian的博客 1233

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

再谈应用程序分段: 数据段、代码段、BSS段以及堆和栈

分段本身就是一个比较复杂的内容,值得再专门写一遍文章介绍,本文再前文基础上再谈应用程序的分段。

luoganttcc的博客 2188

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

c语言常用内存详解(堆,栈,bss段,数据段)

原文链接:https://blog.youkuaiyun.com/z215367701/article/details/75554242 BSS段:(bss segment)通常是指用来存放程序中未初始化的全局变量的一块内存区域。BSS是英文Block Started by Symbol的简称。BSS段属于静态内存分配。 数据段:数据段(data segment)通常是指用来存放程序中已初始化的全局变量的一块内存区域。数据段属于静态内存分配。 代码段:代码段(code segment/text segmen.

xinyuan510214的专栏 3575

代码段、数据段、bss段、堆、栈(程序中内存分配与管理)

什么是代码段、数据段、bss段、堆、栈

qq_36075612的博客 1290

【嵌入式内存分配】数据段、 BSS 段、代码段、堆和栈段

*数据段是程序中用于存放已初始化的全局变量和静态变量的一块内存区域。**这些变量在程序编译时就已经确定了其大小和初始值,并在程序加载到内存时,这些初始值会被复制到数据段中相应的位置。数据段的内容在程序运行期间通常保持不变,除非程序通过代码显式地修改这些变量的值。数据段属于静态内存分配,意味着在程序运行之前,操作系统或编译器就已经为数据段分配了足够的内存空间。与堆栈段和堆段不同,数据段的内存分配和释放是由编译器在编译时确定的,而不是在程序运行时动态分配的。

v13111329954的博客 1175

全局变量分配在数据段_再谈应用程序分段:代码段、数据段、bss以及堆和栈

天星读完需要4分钟速读仅需 2 分钟分段本身就是一个比较复杂的内容,值得再专门写一遍文章介绍,本文再前文基础上再谈应用程序的分段1 ELF 文件旧文讲过 ELF 文件结构大致如下图:我们知道 ELF 文件包含三种类型:可重定位文件(*.o)、可执行文件、以及共享库(share library)。三种文件格式从结构上来说基本一致,只是具体到每一个结构不同。代码段(.text)是可执行指...

weixin_35159405的博客 1770
上一篇: 【C语言入门】指针与数组的等价性
下一篇: 【C语言入门】内存泄漏
Mr_-G
Mr_-G 优质创作者: 嵌入式与硬件开发技术领域 优质创作者: 嵌入式与硬件开发技术领域
博客等级 码龄6年 7922粉丝 416原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值