首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

C语言内存讲解-详说内存分布和heap空间

(text)、数据区(data)和未初始化数据区(bss)3 个部分(有些人直接把data和bss合起来叫做静态区全局区)。...全局初始化数据区/静态数据区(data) 该区包含了程序明确被初始化全局变量、已经初始化静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)。...未初始化数据区(又叫 bss 区) 存入全局初始化变量和未初始化静态变量。未初始化数据数据程序开始执行之前被内核初始化为 0 或者空(NULL)。...未初始化数据区(BSS) 加载可执行文件BSS,位置可以分开亦可以紧靠数据,存储于数据数据全局初始化,静态未初始化数据生存周期为整个程序运行过程。...全局初始化数据区/静态数据区(data segment) 加载可执行文件数据,存储于数据全局初始化,静态初始化数据,文字常量(只读))数据生存周期为整个程序运行过程。

54430

轻松带你解决c语言堆、栈、数据、代码bss疑惑

(它也被称为数据区、静态数据区、静态区):数据就是程序数据,直观理解就是C语言程序全局变量。(注意:全局变量才算是程序数据,局部变量不算程序数据(它在栈上),只能算是函数数据)。...3、什么bss?      (它又叫ZI(zero initial)):bss特点就是被初始化为0,bss本质上也是属于数据bss就是被初始化为0数据。...注意:       数据(.data)和bss区别和联系:二者本来没有本质区别,都是用来存放C程序全局变量。...区别在于把显示初始化为非零全局变量存在.data,而把显式初始化为0或者并未显式初始化C语言规定未显式初始化全局变量值默认为0)全局变量存在bss。...(普通局部变量分配在栈上,静态局部变量分配在.data)。         c、未初始化显式初始化为0全局变量放在bss(这里就可以解释开头网友问问题了)。

1.2K20
您找到你想要的搜索结果了吗?
是的
没有找到

深入理解Linux C语言内存管理

data静态数据区存放程序初始化全局变量、静态变量和常量。   (3)未初始化数据区(BSS)。在运行时改变其值。...BSS BSS (bss segment )通常是指用来存放程序初始化全局变量一块内存区域。BSS 英文Block Started by Symbol 简称。...在有操作系统支持时,这些属性页操作系统管理和维护。   C语言程序编译完成之后,已初始化全局变量保存在DATA,未初始化全局变量保存在BSS。...TEXT和DATA都在可执行文件系统从可执行文件中加载;而BSS不在可执行文件系统初始化BSS只保存没有值变量,所以事实上它并不需要保存这些变量映像。...注意它与数据结构两回事,分配方式倒是类似于链表   全局区(静态区)(static)—全局变量和静态变量存储放在一块初始化全局变量和静态变量一块区域,未初始化全局变量和未初始化静态

2.7K10

蒋豆芽面试题专栏总结(C++软件开发与嵌入式软件)完成了!

函数指针使用过程中指向一个函数。通常用于函数回调应用场景 请说说内存分布模型 从低地址到高地址,一个程序代码数据BSS组成。...数据:存放程序初始化全局变量和静态变量一块内存区域。 代码:存放程序执行代码一块内存区域。只读,代码头部还会包含一些只读常数变量。...全局变量bss还是data BSS通常是指用来存放程序初始化或者初始化为0全局变量和静态变量一块内存区域。...特点可读写程序执行之前BSS会自动清0。...⭐⭐⭐⭐⭐ 1.19 初始化为0全局变量bss还是data⭐⭐⭐⭐ 蒋豆芽秋招打怪之旅——C++说爱你不容易 1.1 你怎么理解C语言和C++区别?

1.9K41

Linux虚拟地址空间布局

0符号(该初值即common block大小) C语言中,未显式初始化静态分配变量被初始化为0(算术类型)指针(指针类型)。...由于程序加载时,BSS会被操作系统清零,所以未赋初值初值为0全局变量都在BSSBSS仅为未初始化静态分配变量预留位置,目标文件并不占据空间,这样可减少目标文件体积。...注意,尽管均放置于BSS,但初值为0全局变量强符号,而未初始化全局变量弱符号。...采用段式内存管理架构(如Intel 80x86系统),BSS通常指用来存放程序初始化全局变量一块内存区域,该段变量只有名称和大小却没有值。程序开始时系统初始化清零。...数据保存在目标文件(嵌入式系统里一般固化镜像文件),其内容程序初始化

3.3K40

linux进程内存布局

BSS采用段式内存管理架构BSSbss segment)通常是指用来存放程序初始化全局变量一块内存区域。BSS英文Block Started by Symbol简称。...BSS属于静态内存分配。 数据采用段式内存管理架构数据(data segment)通常是指用来存放程序初始化全局变量一块内存区域。数据属于静态内存分配。...(因为函数局部变量存放在此,因此其访问方式应该是栈指针加偏移方式,否则若通过push、pop操作来访问相当麻烦) data静态数据区存放程序初始化全局变量、静态变量和常量。...BSS 属于静态内存分配,即程序一开始就将其清零了。 比如,C语言之类程序编译完成之后,已初始化全局变量保存在.data ,未初始化全局变量保存在.bss 。...text和data都在可执行文件嵌入式系统里一般固化镜像文件),系统从可执行文件中加载;而BSS不在可执行文件系统初始化。 ?

3K41

C++内存布局

1.2 全局初始化数据区/静态数据区(data)该区包含了程序明确被初始化全局变量、已经初始化静态变量(包括全局静态变量和局部静态变量)和常量数据(如字符串常量)。...2.2 未初始化数据区(BSS)加载可执行文件BSS,位置可以分开亦可以紧靠数据,存储于数据数据全局初始化,静态未初始化数据生存周期为整个程序运行过程。...,在内存bssb一个未初始化静态全局变量,作用域为本源文件,生命期整个程序运行期间,在内存bssc一个未初始化局部变量,作用域为函数func体内,即仅在函数体内可见,生命期也是函数体内...,生命期main函数内,在内存pi一个局部指针,指向堆一块内存块,该块大小为sizeof(int),pi本身存储在内存,生命期main函数内新申请内存块,生命期malloc...该段变量执行之前初始化为0NULL。栈:系统管理,高地址向低地址扩展。堆:动态内存,用户管理。

324101

Linux 进程虚拟地址空间布局

对于 Linux,4GB 虚拟地址空间默认分配状态如下: 2.虚拟地址空间布局 C/C++程序为编译链接后生成可执行二进制文件,多个组成,一般包含代码数据BSS 等。...未初始化数据BSS Segment,Block Started by Symbol),又称为BSS,通常用来存放程序初始化全局变量和 Static 变量。...堆(Heap),用于保存程序运行时动态申请内存空间,开发人员手动申请,手动释放,若不手动释放,程序结束后由系统回收,生命周期整个程序运行期间,比如使用malloc()new申请内存空间。...Linux,如果使用malloc()申请一块过大内存,C库函数便会创建这种内存映射,而不是使用堆内存。...段名存储内容分配方式生长方向读写特点运行态代码程序指令、字符串常量、虚函数表静态分配低到高只读用户态数据初始化全局变量和静态变量静态分配低到高可读可写用户态BSS初始化全局变量和静态变量静态分配低到高可读可写用户态堆动态申请数据动态分配低到高可读可写用户态映射动态链接库

5K50

程序内存布局

C/C++程序为编译后二进制文件,运行时载入内存,运行时内存分布代码初始化数据、未初始化数据、堆和栈构成,如果程序使用了内存映射文件(比如共享库、共享文件),那么包含映射。...未初始化数据BSS Segment,Block Started by Symbol),又称为BSS,通常用来存放程序初始化全局变量和Static,虽未显示初始化,但在程序载入内存执行时,内核清...堆(Heap),用于保存程序运行时动态申请内存空间,开发人员手动申请,手动释放,若不手动释放,程序结束后由系统回收,生命周期整个程序运行期间,比如使用malloc()new申请内存空间。...Linux,如果使用malloc()申请一块过大内存,C库函数便会创建这种内存映射,而不是使用堆内存。...BSS初始化全局变量和静态变量 静态分配 低到高 可读可写 用户态 堆 动态申请数据 动态分配 低到高 可读可写 用户态 映射 动态链接库、共享文件、匿名映射对象 动态分配 低到高 可读可写

2K11

CC++ 学习笔记七(内存管理)

---------\n"); printf(" \t bss_var地址:%p \n",&bss_var); printf("已初始化数据 .data \n"); printf...-------------------- b地址 :0x100203850 未初始化数据 .bss -------------------- bss_var地址:\314p...C语言中,内存分配有三种 静态区域分配:编译器自动分配与释放,内存在编译时候已经分配好,这块内存在整个程序运行期间都存在直到程序结束时才被释放,如全局变量与static变量。...内存分配函数后必须对数据进行初始化 使用malloc进行分配时,因该内存函数为进行初始化,若此时对内存进行访问,很可能会造成程序崩溃 char * chp = (char *)malloc(sizeof...禁止执行0长度内存分配 C99规定,程序尝试分配长度为0内存时,该行为具体编译器所决定。可能会到时程序崩溃,可能返回一个NULL指针。所以需要避免此行为。

1.9K01

《UNIX环境高级编程》第七章进程环境

跟参数列表一样,环境表也是一个字符指针数组。其中每个指针包含一个以null结束C字符串地址。 全局变量environ则包含了该指针数组地址。...(这个重点) 历史沿袭至今,C程序一直下列几部分组成: 地址低到高: 正文段(代码):CPU执行机器指令部分。...通常,正文段可共享。存放有:代码、const全局变量、const静态变量、字符串字面值 数据(已经初始化了):包含了程序明确赋初值变量。例如:C程序任何函数之外声明。...BSS(未初始化数据):未初始化全局变量和静态变量 堆区:用来动态分配内存,malloc出来东西(低向高扩散) 栈区:自动变量以及每次函数调用时所需保存信息保存在此段。...c++把变量默认为自动存储。用static说明局部变量只能在定义该变量函数体中使用。不过与自动变量不同,static静态变量第一次使用时进行初始化(默认初始值为0)。

48110

C语言编程程序内存如何布局

程序运行时又会产生其他几个部分,各个部分代表了不同存储区域:   1.代码(CodeText)   代码程序执行机器代码组成。C语言中,程序语句进行编译后,形成机器代码。...4.未初始化数据(BSS)   未初始化数据程序声明,但是没有初始化变量,这些变量程序运行之前不需要占用存储器空间。   ...3.所有函数体外定义全局变量,加了static后变量不管函数内部外部都放在全局区。   4.使用const定义变量将放于程序只读数据区。   ...  static char BSS_2[100]; //局部未初始化数据   static int c = 0; //全局(静态)初始化区   p1=(char *)malloc(10 * sizeof...对于未初始化数据BSS_1[100]与BSS_2[100],其区别在于前者全局变量,在所有文件中都可以使用;后者局部变量,只函数内部使 用。

1.7K20

STM32 内存分配解析及变量存储位置

Flash 代码和数据存放在 flash ,下面将 flash 内部进行细分之后一张图,图中标明了代码数据以及常量 flash 位置。 ?...),第一次遇到这个概念朋友看到数据复制可能会有所疑惑,其实这个充当作用是存放程序初始化为非 0 值全局变量初始值,之所以要将初始值存放到这里,是因为全局变量存放在 RAM 上,RAM 上值掉电便丢失...如上图所示,RAM 包含了如下几个部分: 栈 (Stack) : 存放局部变量和函数调用时返回地址 堆 (heap) : malloc 申请, free 释放 bss : 存放未初始化或者初始化为...0 全局变量 data : 存放初始化为非 0 值全局变量 下面举一个简单例子来说明变量各个存储位置: #include #include int...0全局变量,他们都存放于 RAM bss static 修饰staticvar 和 static_var1 都存放于 bss,区别只在于两个变量作用域不同。

3K10

C 、汇编入门与逆向分析

分配方式 一个程序本质上都是 Bss 、Data、Text三个组成 Text 通常是指用来存放程序执行二进制代码 Bss 一般指用来存放程序初始化全局变量 Data 包括三部分...mallocnew(C++)申请,需主动释放free、delete,否则会造成内存泄漏 栈(stack):编译器自动分配释放,存放函数传参,局部变量,函数括弧“{}”定义变量(但不包含static...static意味着在数据存放变量 静态数据区: 已初始化全局变量、静态变量和常量。...int a = 0; //全局初始化区,静态数据区 char *p1; //全局初始化bss char* func(){//写法正确 char *str = "hello,world";...; //全局(静态)初始化区,静态数据区 int b; //栈 char s[10] = "abc"; //字符串和s都是栈区,字符数组s栈区分配内存 char *p3 = "

52530

C++学习总结2——C++内存模型

其中rodata区和text区加载时会合并到一个,该段称为常量区,该区域内容只允许读,不允许修改; data区和bss加载时合并到一个,该段被称为全局区,其中内容,对程序来说,可读可写...bss bssblock started by symbol缩写,该区域存放未初始化 全局变量和被声明为static局部变量。...加载时该区域值会被全部设置为0(对算术类型)NULL(对指针类型)。...因为data区和bss区中保存都是全局变量和静态局部变量(跟全局变量性质一致),所以程序启动时,这两个区域又被放到一个叫做全局箱子,这个箱子内容可读可写。...该区域内存管理必须由程序写作者来负责,也就是如果通过newmalloc申请了一块内存,程序结束时必须通过deletefree来释放相应内存。new和delete内容我后面会仔细说明。

51810

C 语言】内存管理 ( 动态内存分配 | 栈 | 堆 | 静态存储区 | 内存布局 | 野指针 )

) : 存放代码内容, 编译时就确定了, 只能读, 不能写 ; 2.数据 ( .data section ) : 存放 已经初始化 静态局部变量 和 全局变量, 编译阶段确定, 可读写 ; 3.BSS... ( .bss section ) : 存放 没有初始化 静态局部变量 和 全局变量, 可读写 , 程序开始执行时候 初始化为 0 ; ---- ( 2 ) 分析程序文件内存布局 分析简单程序...全局 int 类型变量, 并且进行了初始化, 存放在 数据 int global_int = 666; //2....3.bss : 从程序文件映射到内存空间中 , 存放 没有初始化 静态局部变量 和 全局变量, 其值自动初始化为 0 ; 4.data : 从程序文件映射到内存空间中 , 存放 已经初始化...执行函数时, 会根据 esp 栈顶指针 查找函数 局部变量等信息, 需要静态变量会从 bss data 查找信息, 需要常量值时 去 rodata 去查找信息 ; ---- 四.

1.6K40

C++知识概要

静态变量初始化 静态局部变量和全局变量一样,数据都存放在全局区域,所以主程序之前,编译器已经为其分配好了内存。 C++ 初始化执行相关代码时才会进行初始化。...代码,也有可能包含一些只读常数变量,例如字符串常量等 数据 储存已被初始化静态数据数据(data segment )通常是指用来存放程序初始化全局变量一块内存区域。...数据属于静态内存分配。 BSS 初始化数据BSS bss segment )通常是指用来存放程序初始化全局变量一块内存区域。...BSS 属于静态内存分配(BSS 和 data 区别是 ,如果一个全局变量没有被初始化初始化为 0),那么他就存放在 bss ;如果一个全局变量被初始化为非 0,那么他就被存放在 data...注意它与数据结构两回事,分配方式倒是类似于链表 全局区(静态区)(static) — 全局变量和静态变量存储放在一块初始化全局变量和静态变量一块区域,未初始化全局变量和未初始化静态变量相邻另一块区域

1.1K20

熬夜整理万字CC++总结(一),值得收藏

如果愿意,您可以细调程序以获得最大速度最大内存使用率。 可移植性。c语言一种可移植语言。意味着,一个系统上编写c程序经过很少改动不经过修改就可以在其他系统上运行。... 全局初始化数据区/静态数据区(data) 该区包含了程序明确被初始化全局变量、已经初始化静态变量(包括全局静态变量和t)和常量数据(如字符串常量)。... 未初始化数据区(又叫 bss 区) 存入全局初始化变量和未初始化静态变量。未初始化数据数据程序开始执行之前被内核初始化为 0 或者空(NULL)。... 未初始化数据区(BSS) 加载可执行文件BSS,位置可以分开亦可以紧靠数据,存储于数据数据全局初始化,静态未初始化数据生存周期为整个程序运行过程。... 全局初始化数据区/静态数据区(data segment) 加载可执行文件数据,存储于数据全局初始化,静态初始化数据,文字常量(只读))数据生存周期为整个程序运行过程。

44411
领券