c/c++中关于变量存储的位置

C/C++变量的内存位置和初始化 每个变量都需要在内存中分配一定的空间来存储它的值,而且变量的初始化也是非常重要的,因为它决定了变量在使用之前的初始值。本文将详细介绍C/C++变量在内存中的位置以及初始化的问题,并提供相应的源代码示例。全局变量存储在静态存储区域,局部变量存储在栈内存中,而动态分配的变量存储在堆内存中。全局变量是在函数外部声明的变量,它们在整个程序的执行过程中都是可见的。局部变量是在函数内部声明的变量,它们只在声明它们的函数的作用域内可见。需要注意的是,如果在声明变量时没有显式地进行初始化,那么变量将被赋予一个未定义的值。 阅读详情

我们先看一下内存区域的分配

bss段 :一个程序本质上是由 bss段、data段、text段三个组成的,bss段通常是指用来存放程序中 未初始化的全局变量、静态变量(全局变量未初始化时默认为0)的一块内存区域。

数据段 :通常是指用来存放程序中 初始化后的全局变量和静态变量。

代码段 :通常是指用来存放程序中 代码和常量。

堆(heap):通常是指用来存放程序中 进程运行时被动态分配的内存段 ( 动态分配:malloc / new,动态释放:free / delete)。

栈(stack) :由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 

堆(heap)和栈(stack)的区别 

1、申请方式

栈: 由系统自动分配。例如,声明在函数中一个局部变量int b;系统自动在栈中为b开辟空间

堆: 需要程序员自己申请,并指明大小( 动态分配:malloc / new,者动态释放:free / delete)

2、申请后系统的响应

栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。

堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时, 
会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。

3、申请大小的限制

栈:在Windows下,栈是向低地址扩展的数据结构,是一块连续的内存的区域。

堆:堆是向高地址扩展的数据结构,是不连续的内存区域。这是由于系统是用链表来存储的空闲内存地址的,自然是不连 
续的。
(4)申请效率的比较:

栈:由系统自动分配,速度较快。但程序员是无法控制的。

堆:是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便. 
另外,在WINDOWS下,最好的方式是用Virtual Alloc分配内存,他不是在堆,也不是在栈,而是直接在进程的地址空间中保留一块内存,虽然用起来最不方便。但是速度快,也最灵活。

在代码中我们可以直观的看出效果 

#include<stdio.h>

int a = 0;//初始化的全局变量:保存在数据段
int *p;//未初始化的全局变量:保存在BSS段

int main()
{
    int b;//未初始化的局部变量:保存在栈上
    char s[] = "abc";//数组保存在栈上,"abc"保存在栈上

    char *p2;//p2保存在栈上
    char *p3 = "123456";//p3保存在栈上,"123456\0"保存在data区上

    static int c = 0;//初始化的局部变量:保存在数据区(数据段)

    p1 = (char *)malloc(sizeof(char) * 10);//分配的10字节区域保存在堆上
    p2 = (char *)malloc(sizeof(char) * 20);//分配的20字节区域保存在堆上

    strcpy(p1, "123456");

    free(p1);
    free(p2);

    return 0;
}

 


 

 

鼎捷T100二次开发实战:如何给开窗功能加上权限锁(附完整代码) 本文详细解析了鼎捷T100二次开发中开窗功能权限锁的实现方法,提供了两种技术方案:开窗程序重构法和动态WHERE条件注入法,并附上完整代码示例。通过真实案例,帮助开发者解决数据权限细粒度控制的难题,提升ERP系统的安全性和实用性。 阅读详情

相关推荐

STM32CubeMX-电机控制2-电机相关配置部分

STM32CubeMX-电机霍尔传感器 写在前面的话:之前一直使用库函数,调程序时总会觉得是配置出现问题,要画一些时间去检查配置程序,所以目前转到了STM32CubeMX。写这些内容一方面是整理记录,因为是刚入门,所以难免出现错误,希望能得到大家指正;另一方面是因为自己一个人调试,走了很多弯路,写下来希望能给相同处境的人一些参考。 步骤一: 电机霍尔传感器接口 我目前使用的是STM32F4,电机的...

niker_co的博客 1万+

C/C++程序内存的各种变量存储区域和各个区域详解

C语言在内存中一共分为如下几个区域,分别是: 1. 内存栈区: 存放局部变量名; 2. 内存堆区: 存放new或者malloc出来的对象; 3. 常数区: 存放局部变量或者全局变量的值; 4. 静态区: 用于存放全局变量或者静态变量; 5. 代码区:二进制代码。 知道如上一些内存分配机制,有助于我们理解指针的概念。 C/C++不提供垃圾回收机制,因此需要对堆中的数据进行及时销毁,防止内存泄漏,使用free和delete销毁new和malloc申请的堆内存,而栈内存是动态释放。 全局变量、静态局.

lijian2017的博客 4313

Hyper-V虚拟机 安装 银河麒麟V10桌面版

如何在windows 11 Hyper-V 虚拟机中 安装 银河麒麟V10桌面版。

m0_46756112的博客 3420

关于c/c++指针改变变量地址小坑(指针的指针)

#include "stdio.h" #include "stdlib.h" #include <iostream> using namespace std; int change(int *n,int *m) { m = n; } int change2(int **n,int **m) { *m = *n; } int main(void) { int a = 1,b = 2; int *c = &a,*d = &b; cout <&l.

weixin_44818115的博客 681

Vienna整流器双PI闭环仿真:从SVPWM调制到中点电位平衡的实践解析

本文深入解析Vienna整流器双PI闭环仿真技术,涵盖SVPWM调制和中点电位平衡的实践细节。通过详细的MATLAB/Simulink仿真搭建流程和常见问题排查方法,帮助工程师掌握高效整流器控制策略,提升系统稳定性和动态响应性能。

weixin_29168153的博客 327

matlab特征提取和分类_SAST Weekly|MATLAB机器学习初探——做个心音分类器

SAST weekly 是由电子工程系学生科协推出的科技系列推送,内容涵盖信息领域技术科普、研究前沿热点介绍、科技新闻跟进探索等多个方面,帮助同学们增长姿势,开拓眼界,每周更新,欢迎关注!欢迎愿意分享知识的同学投稿至 eesast@mail.tsinghua.edu.cn , 期待你的作品!本期的SAST weekly,想跟大家分享一下如何用MATLAB进行初步的机器学习,构建一个正常/...

weixin_36453829的博客 5580

全局/静态变量初始化为0放在bss段还是data段?

转自此博客 我们都知道: 1)有初始化的全局变量,该全局变量存放在data段 2)没有初始值的全局变量放在BSS段。 实际上在arm-linux-gcc这个开发环境中,如果全局变量的初始值是0,编译器会将该全局变量放在BSS段。 初始值是0的全局变量放在BSS段会有什么问题? 如果少了text代码帮他初始化为0,这个全局变量将会成为随机值。而不是0。 因此text段会有一段代码将BSS段初始化为0。 如下图: ...

weixin_44164489的博客 5217

卷积码和Turbo码

通信原理相关博文目录:目录我们常在移动通信中遇到的卷积码就是一种非分组码,卷积码和信号处理中的卷积运算有关系吗?是不是就是信号处理中的卷积运算,先看看编码器的编码原理再说:下面是一个比较实用的卷积码编码器:它有三个移位寄存器D0,D1,D2和三个模2加法器,以及一个旋转开关组成,编码前,先将各级移位寄存器清零:现在假设输入的信息码元是1101:当输入的第一个码元为1时,三个模2加法器计算的结果都为...

Reborn Lee 2万+

c/c++里的 堆区 栈区 静态区 文字常量区 程序代码区

<br /> 一个由C/C++编译的程序占用的内存分为以下几个部分<br />  1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。 <br />       堆(heap):由malloc,new等分配的空间的地址,地址由低向高增长(程序员释放)。<br />  2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。 <br />       栈

lcy9819的专栏 1020

Realtek RTD1319D芯片解析:H.266与AV1双解码的机顶盒SoC

视频编解码技术是数字媒体传输的核心,H.266/VVC作为新一代标准,相比H.265提升50%压缩效率,显著降低带宽需求。其实现原理依赖于专用硬件解码器和并行处理架构,在超高清视频传输领域具有重要价值。Realtek RTD1319D作为首款商用H.266处理器,采用异构计算设计,集成四核ARM CPU和独立视频处理单元,同时支持AV1解码,兼顾市场兼容性。该SoC特别适合4K机顶盒、数字标牌等应用场景,其HDMI 2.1a接口和DVB解调器为超高清内容传输提供完整解决方案。开发时需注意散热设计和内存配置优

weixin_42591413的博客 672

PCIE配置和地址空间

来源:https://www.jianshu.com/p/574e9a2cbc4e 每个PCIe设备,有这么一段空间,Host软件可以读取它获得该设备的一些信息,也可以通过它来配置该设备,这段空间就叫做PCIe的配置空间。不同于每个设备的其它空间,PCIe设备的配置空间是协议规定好的,哪个地方放什么内容,都是有定义的。PCI或者PCI-X时代就有配置空间的概念,那时的配置空间如下: 图6.1 整个配置空间就是一系列寄存器的集合,其中Type 0是Endpoint的配置,Type 1是Brid.

qq_28643619的博客 4060

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

在 C/C++ 中,变量的存储位置直接影响其生命周期、作用域和访问方式。以下是主要存储区域存储区 分配方式 生命周期 典型用途栈自动函数调用期间局部变量、参数堆手动(new/malloc)显式释放前动态数据结构静态区编译器程序运行期间全局变量、静态变量文字常量区编译器程序运行期间字符串常量、const代码区编译器程序运行期间可执行指令理解这些区域有助于避免内存泄漏、悬垂指针等问题,并优化程序性能。

在你不想做的时候,正是应该做的时候。 1275

【安全设备篇】HVV面试专题

还有就是这个可能是被访问的这个内网系统,本身业务系统存在业务逻辑问题,因为内网所布置的很多业务系统往往不会考虑一些安全性问题,比如在正常的业务逻辑请求中直接带了sql语句,就会触发设备规则产生告警,这一类是属于误报,然后会将此告警上报给研判人员,需要研判组专家和甲方客户确认下是否是该系统存在此业务逻辑问题,并且需要确认告警的源ip在此告警的时间段附近有没有进行操作过。天眼日志分析主要基于系统和应用程序的日志数据来识别安全威胁,而威胁感知则通过收集和分析多种来源的情报信息。理解威胁的性质和威胁背后的原理。

大河之犬的博客 7924

C/C++中 变量的存储位置

C/C++中 变量的存储位置       最近正在学习uCOS-II,其中不乏N多需要对不同变量在系统内存中的位置的了解,下面做下总结,供以后查阅   一下内容转自:http://www.docin.com/p-210019581.html 感谢分享。      1、首先,讲下 “堆 heap” 和 “栈 stack” 的区别:     一个由 c

zaishaoyi的专栏 768

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

C/C++ 中的变量存储位置:栈、堆、全局 / 静态区详解

本文详细解析了C/C++程序中的变量存储位置及其特性。内存被划分为5个核心区域:栈区(局部变量,自动管理)、堆区(动态内存,手动管理)、全局/静态区(全局变量和static变量)、常量区(只读数据)和代码区。文章通过代码示例对比了不同存储区域的管理方式、生命周期和风险点,如栈溢出、内存泄漏和野指针等问题。最后总结了变量存储规则对程序稳定性和性能的影响,并提供了高频面试题和实战避坑指南,帮助开发者深入理解内存管理机制。

2301_76830733的博客 586

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

深入理解C/C++程序内存布局:从变量存储位置说起

特点:自动管理、速度快、空间有限、LIFO(后进先出)存储内容:局部变量、函数参数、返回地址等注意事项:避免在栈上分配过大数组(可能导致栈溢出)理解C/C++程序的内存布局是成为优秀C/C++程序员的基础。通过本文的分析,我们可以看到:不同类型的变量存储在不同的内存区域每个内存区域有特定的用途和特点正确的内存管理可以避免许多常见的编程错误掌握这些知识不仅有助于编写更高效的代码,还能帮助调试内存相关的问题,如内存泄漏、野指针、段错误等。记住,清晰的内存管理是编写高质量C/C++代码的关键!

qq_67169366的博客 636

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

C/C++中变量的存储位置

1、首先,讲下 “堆 heap” 和 “栈 stack” 的区别:     一个由 c/c++编译过的程序占用的内存分为一下几个部分     (1)、栈区 stack :由编译器自动分配释放,               存放函数的参数值,局部变量的值等。               这个栈的操作方式类似于数据结构中的栈。     (2)、堆区 heap :一般由程序

nicomo10的专栏 502

C/C++中关于变量的存储位置

内存分配区域 32位操作系统下为:1G内核态,3G用户态 BSS段 :通常是指用来存放程序中 未初始化的全局变量、静态变量(全局变量未初始化时默认为0)的一块内存区域 数据段 :通常是指用来存放程序中 初始化后的全局变量和静态变量 代码段 :通常是指用来存放程序中 代码和常量 堆 :通常是指用来存放程序中 进程运行时被动态分...

浮生流年的博客 6177

C/C++中static关键字及变量存储位置总结

今天看博文时,看到了c++的static关键字的一些总结,还涉及到了一些代码的存储位置,为了有时间的时候能够看一下,还是自己把它给摘抄下来吧。 C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。 一、面向过程设计中的static 1、静态全局变量 在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量。我们先举一个静态全局变量的例子,如下: ...

希哈科技 996

c/c++变量的存储位置

变量的内存一般分为5部分 栈区stack:由编译器自动分配释放,,存放函数的参数值,局部变量等,对栈的操作方式类似于数据结构中的栈 堆区heap :一般由程序员分配释放,如果程序员不释放,程序结束时可能由OS挥手,但是它与数据结构中的堆是两回事,分配方式类似于链表。 全局区(静态区)satic: 全局变量和静态变量的存储是放在一块的。初始化的全局变量和静态变量放在一块区域,未初始化的全局变量和静态变

蔡松豆的博客 1308

C/C++中 变量的存储位置,BSS段

内容转自:http://www.docin.com/p-210019581.html 感谢分享。

点十八的一方天地 2296
下一篇: C\C++头文件中的#pragma
XuSheng.Mrs
博客等级 码龄9年 29粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值