【问题】栈区地址分配之谜:为什么局部变量的地址会递增?

进程空间内存分配详解 进程空间的内存分配 从高地址到低地址如图所示: 名称 操作系统内核区 用户不可见 用户栈 栈指针,向下扩展 动态堆 向上扩展 全局区(静态区) .data初始化.bss未初始化 文字常量区(只读数据) 常量字符串 程序代码区 栈指针,向下扩展 下面详细介绍这几个区域: 1.栈区: 由编译器自动分配释放,速度较快 程序在编译期对变量,返回地址,参数和函数分... 阅读详情

在大多数操作系统中,进程的栈是向下增长的。这意味着栈的起始地址通常是高地址,而随着数据的推入(如函数调用、局部变量等),栈指针会向低地址移动。这种设计有助于栈和堆之间的空间利用,因为堆是向上增长的。、

在这里插入图片描述
这必须要实验一下

#include <iostream>
using namespace std;
int g_A;
int g_B = 100;
int main()
{
        const char* a = "ab";
        static int s_A = 5;
        int A;
        int B;
        int C;
        int* m_A = new int;
        int* m_B = new int;
        int* m_C = new int;
        printf("字符常量:a : %p\n", a);
        cout << "静态变量:s_A : " << &s_A << endl;
        cout << "全局变量:未初始化g_A : " << &g_A << endl;
        cout << "全局变量:已初始化g_B : " << &g_B << endl;
        cout << "栈区:A : " << &A << endl;
        cout << "栈区:B : " << &B << endl;
        cout << "栈区:C : " << &C << endl;
        cout << "堆区:m_A : " << m_A << endl;
        cout << "堆区:m_B : " << m_B << endl;
        cout << "堆区:m_C : " << m_C << endl;
}

ubuntu g++:
字符常量:a : 0x5649d4534009
静态变量:s_A : 0x5649d4536014
全局变量:未初始化g_A : 0x5649d4536154 未初始化地址 > 已初始化地址 符合
全局变量:已初始化g_B : 0x5649d4536010
栈区:A : 0x7ffc892fb3cc 栈区的地址是增长的, 不符合
栈区:B : 0x7ffc892fb3d0
栈区:C : 0x7ffc892fb3d4
堆区:m_A : 0x5649d5eadeb0 堆区的地址是增长的,符合
堆区:m_B : 0x5649d5eaded0
堆区:m_C : 0x5649d5eadef0

windows vs2019
字符常量:a : 00639B30
静态变量:s_A : 0063C004
全局变量:未初始化g_A : 0063C3E0
全局变量:已初始化g_B : 0063C000
栈区:A : 004FFBA8
栈区:B : 004FFB9C
栈区:C : 004FFB90
堆区:m_A : 0069FD68
堆区:m_B : 0069FD98
堆区:m_C : 006A0118

怎么linux栈区的地址是向上增长的呢?

这里要解释一个概念:函数栈帧,当我们调用函数时,栈区会开辟一块空间给函数使用。而函数内的局部变量是在函数栈帧中开辟空间。
函数栈帧深度剖析(一篇带你牢牢掌握函数栈帧)_函数栈帧 游戏-优快云博客

函数栈帧的分配是向下增长的,但是函数栈帧内部的局部变量的地址分配是由编译器的策略来决定的,
在这里插入图片描述

Ubuntu、stm32下的C程序中堆、栈、全局、局部等变量的分配地址 目录一、C程序中的一些变量及内存分配1、全局变量2、局部变量3、内存分配4、内存段二、在Ubuntu和Keil中显示变量地址分配 一、C程序中的一些变量及内存分配 1、全局变量 在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,也就是所有的源文件,包括 .c 和 .h 文件。 例如: int a, b; //全局变量 void func1(){ //TODO: } float x,y; //全局变量 int func2(){ //TODO: 阅读详情

相关推荐

在Ubuntu系统和STM32(Keil)中分别进行编程显示分配地址并进行比较

堆和栈空间分配栈:向低地址扩展堆:向高地址扩展显然如果依次定义变量,先定义的栈变量的内存地址比后定义的栈变量的内存地址要大。先定义的堆变量的内存地址比后定义的堆变量的内存地址要小堆和栈变量栈:临时变量,退出该作用域就会自动释放。堆:malloc变量,通过free函数释放。堆和栈的区别:stack的空间由操作系统自动分配/释放,heap上的空间手动分配/释放。stack的空间有限,heap是很大的自由存储区。

weixin_62789044的博客 530

c语言-堆和栈的生长方向

如何判断栈的增长方向? 对于一个用惯了i386系列机器的人来说,这似乎是一个无聊的问题,因为栈就是从高地址向低地址增长。不过,显然这不是这个问题的目的,既然把这个问题拿出来,问的就不只是i386系列的机器,跨硬件平台是这个问题的首先要考虑到的因素。 在一个物质极大丰富的年代,除非无路可退,否则我们坚决不会使用汇编去解决问题,而对于这种有系统编程味道的问题,C是一个不错的选择。那接下来的

hayfly的专栏 7748

C++之指针、引用、数组、堆区栈区

指针 指针(pointer)是一个值为内存地址的变量(或数据对象) 基本用法 数据类型 * 指针变量名 如 int * ptr_num 注意: Int* p 写法偏向地址 P是一个地址变量 表示一个十六进制地址 Int *p偏向值 *p是一个整型变量 能够表示一个整型值 给指针赋值只能使用&符号 空指针(null pointer)空指针不指向任何对象,在试图使用一个指针之前首先检查是否为...

LISIMANHAHA的博客 1118

栈类型

从增长方向上,可分为向上增长和向下增长 向上增长:压栈时,栈指针的值增加,即向高地址方向生长,为递增堆栈 向下增长:压栈时,栈指针的值减小,即向低地址方向生长,为递减堆栈 从栈指针所指的位置,可分为满堆栈和空堆栈 满堆栈:栈顶指针指向最后压入的元素。 空堆栈:栈项指针指向下一个可以存放元素的空间。 综合起来,就有四种方式: 空递增 满递增 空递减 满递减

booksyhay的专栏 1773

WGCNA样本量不够怎么办?5种替代方案帮你解决小样本基因共表达分析难题

本文针对WGCNA样本量不足的问题,提供了5种科学替代方案,包括CEMiTool、参数调整、多组学数据整合、机器学习特征提取和公共数据利用。这些方法帮助研究者在小样本条件下仍能进行可靠的基因共表达分析,特别适用于罕见病和珍贵临床样本研究。

weixin_42554042的博客 303

Ollama本地大模型部署指南:从核心原理到实战避坑

大语言模型(LLM)作为人工智能领域的核心技术,通过海量数据训练获得强大的语言理解和生成能力。其工作原理基于Transformer架构,通过自注意力机制处理序列数据,在文本生成、代码编写和对话系统等场景展现出巨大价值。随着开源模型的普及,本地部署成为关注焦点,它解决了数据隐私和定制化需求,但面临环境配置和资源管理的挑战。Ollama作为开源工具,通过封装模型格式和统一API,简化了本地部署流程,支持GPU加速和性能调优,让开发者能够快速集成到IDE和自动化脚本中,实现高效的本地AI应用部署。

weixin_30915951的博客 451

arm栈推导

栈推导

qq_42693685的博客 714

【目标跟踪】ECO算法论文阅读:ECO: Efficient Convolution Operators for Tracking

这里所指的训练集是指保存了每一帧的跟踪结果的训练集,也就是说,每一次进行model update的时候,要用在这一帧之前所有跟踪到的样本。那么随着视频越来越长,这个训练集就会越来越大。因为当目标被遮挡或者丢失的时候,比较新的这些样本本身就是错的,那么模型很容易有model drift,就是被背景或者错误的目标污染,导致跟踪结果出错。如下图所示,Baseline是传统的训练集,每更新一帧就加一个进来,那么连续的数帧后训练集里面的样本都是高度相似的,即容易遗忘前面的样本,且容易对最近的若干帧样本过拟合。

qq_43799400的博客 2612

栈为什么要由高地址向低地址扩展?

原因 计算机内存分了代码段(.text段)、初始化的数据段(.data段)、未初始化的数据段(.bss段)、堆空间(heap)、栈空间(stack)和命令行参数和环境变量区域。 程序计数器(Program Counter,简称PC)的缺省指向0地址,计算机开机后从程序计数器指向的地址开始执行程序,每执行完一条指令后, 程序计数器自动加1。 因此很自然的,代码段从低地址区间开始加载,向高地址区间扩展; heap从低地址向高地址扩展,做内存管理相对要简单些,为了避免栈空间和代码段冲突,最大利用地址空间,很自然的

Albert52856的博客 6849

ERROR conda.core.link:_execute(502): error occurred while installing conda-forge::setuptools 解决方案

本文主要介绍了ERROR conda.core.link:_execute(502): An error occurred while installing package mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge::setuptools-65.5.1-pyhd8ed1ab_0.FileNotFoundError(2, 系统找不到指定的文件。, None, 2) 解决方案,希望能对新手有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 8万+

【多目标跟踪】ByteTrack复现(有yolov5例子)

1.环境 ubuntu16.04 cuda10.1 cudnn7 python3.6 Cython matplotlib>=3.2.2 numpy>=1.18.5 opencv-python>=4.1.2 Pillow PyYAML>=5.3 scipy>=1.4.1 tensorboard>=2.2 torch>=1.7.0 torchvision>=0.8.1 tqdm>=4.41.0 seaborn>=0.11.0 easydic

聿默的博客 1万+

如何判断栈、堆的增长方向?

如何判断栈的增长方向? 对于一个用惯了i386系列机器的人来说,这似乎是一个无聊的问题,因为栈就是从高地址向低地址增长。不过,显然这不是这个问题的目的,既然把这个问题拿出来,问的就不只是i386系列的机器,跨硬件平台是这个问题的首先要考虑到的因素。 在一个物质极大丰富的年代,除非无路可退,否则我们坚决不会使用汇编去解决问题,而对于这种有系统编程味道的问题,C是一个不错的选择。那接下来的

踏实每一小步,成就一大步 2万+

UE5实现距离测量功能

UE5实现距离测量功能

专注GIS开发 6265

程序运行时堆区和栈区的分配

标题:2009-09-08 20:02:51 程序运行时堆区和栈区的分配    本文为转载,由孙晓明老师所编写,放在我的博客里面主要是为了自己学习方便。 栈(stack):是自动分配变量,以及函数调用所使用的一些空间(所谓的局部变量),地址由高向低减少;  堆(heap):由malloc,new等分配的空间的地址,地址由低向高增长。  看看下面一段代码:  #incl

feng200950080206的专栏 1261

《QGIS空间数据处理与高级制图》【目录】

《QGIS空间数据处理与高级制图》是一本面向GIS技术人员和学生的进阶手册,重点提升数据处理效率和专业制图标准化水平。全书涵盖空间数据预处理、矢量编辑、栅格处理、坐标系统应用和符号化设计等核心内容。书中详细介绍了批量数据转换、拓扑检查、遥感影像处理、自定义坐标系创建等实用技能,并提供了模型构建器和PyQGIS脚本实现自动化操作。通过大量实战案例和问题排查指南,帮助读者从基础使用进阶到专业应用,适合测绘、规划、环保等行业的GIS从业者参考使用。

LuckyHanMo的博客 372

【定位教程2----旋转中心标定之方法一】

【定位教程2----旋转中心标定之方法一】

Quintin 3万+

Ubuntu、stm32下的C程序中堆、栈、全局、局部等变量的地址分配问题

本文章举例说明了在Ubuntu和stm32下,C程序的地址分配问题,发现了二者栈区和堆区的地址值的变化是有所不同的,在这两个例子中,Ubuntu系统下,栈区和堆区的地址值从上到下都是递增的,而在stm32中栈区的地址值是从上到下递减的,堆区的地址值则是从上到下递增的,存在差异,想要观察出变化,还需要动手用程序做更多的证明。

Y255466的博客 441

STM32F407中文手册

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

Ubuntu与STM32C程序中变量的地址分配

目录一、前言二、了解C程序的内存分配三、分别在Ubuntu和STM32中验证C变量地址分配参考资料 一、前言 本文我将会和大家一起先回顾C程序中的全局变量、局部变量、堆、栈的概念,并通过C程序分别在Ubuntu和STM32中找到变量的地址分配,并对其进行分析。 二、了解C程序的内存分配 1、堆区是程序里动态分配的内容,堆区的内存容量大,使用灵活,分配后要自行回收容易产生内存碎片。 2、栈区主要是存储函数的局部变量,然后程序结束后操作系统自行回收但是栈区容量较小。 3、全局区(静态区)(static),全局变

txmnQAQ的博客 1800

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

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

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

在Ubuntu、stm32下的编写C程序分析堆、栈、全局、局部等变量的分配地址

在Ubuntu、stm32下的编写C程序分析堆、栈、全局、局部等变量的分配地址一、C程序的内存分配介绍二、在不同系统下进行编程验证1、在Ubuntu下编程验证2、在STM32(Keil)下编程验证三、实验总结四、参考文献 一、C程序的内存分配介绍 二、在不同系统下进行编程验证 1、在Ubuntu下编程验证 2、在STM32(Keil)下编程验证 三、实验总结 四、参考文献 ...

m0_48861452的博客 459

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

堆、栈、全局变量的分配地址

重温C语言程序里全局变量、局部变量、堆、栈等概念,并在ubuntu系统中编程,输出信息进行验证; 重温C语言程序里全局变量、局部变量、堆、栈等概念,在Keil中针对stm32系统进行编程,调试变量,进行验证; 通过串口输出信息到上位机,进行验证。 并归纳出stm32的堆、栈、全局变量的分配地址,与ARM教材中的地址分配进行对比。 ...

折纸秘制电脑配件 481

C语言与stm32的堆、栈、全局变量的分配地址

全局变量、局部变量、堆、栈一.C语言中堆、栈全局变量的地址分配二.stm32的堆、栈、全局变量的地址分配三.参考博客 一.C语言中堆、栈全局变量的地址分配 通过以下代码来进行理解C语言中各中变量的概念: #include <stdio.h> #include <string.h> #include <stdlib.h> char g_buf[16]; char g_buf2[16]; char g_buf3[16]; char g_buf4[16]; int main

ii231的博客 684

Ubuntu、stm32下的C程序中堆、栈、全局、局部等变量的分配问题

文章目录一. C程序内存分配问题1. 全局变量、局部变量、堆、栈的概念2. C程序的内存分配二. 在Ubuntu(x86)系统和STM32(Keil)中分别进行编程1. 基于Ubuntu的变量地址分配的验证2. 基于STM32(Keil)的变量地址分配的验证3. 烧录程序4. 串口发送数据三. 归纳和对比分析四. 总结五. 参考资料 一. C程序内存分配问题 1. 全局变量、局部变量、堆、栈的概念 全局变量 在所有函数外部定义的变量称为全局变量(Global Variable),它的作用域默认是整个程序,

weixin_48268385的博客 850

code区变量存储地址、全局变量存储地址问题

code区定义的数据,会按照先定义先分配地址,递增的方式存储。 这样用指针访问数组时候,地址依次递增就可以。 全局变量定义数据, 全局变量(堆上)递增存储,局部变量(栈中)递减存储?? 这篇文章写得可以 原文C\C++编译器关于变量的内存分配顺序总结 转载C++中局部和全局变量的地址分配 知识储备: 1. 内存的分区:代码区,数据区,堆,栈。 四个区域司职不同,相互配合。 2. 变量的分类以及初始...

weixin_42916705的博客 1654

C语言 内存分配 代码区、常量区、静态区(全局区)、堆区、栈区

文章目录1 程序的内存组成2 堆操作与栈操作的比较3 堆操作的坏处4 从操作系统角度看stack和heap 1 程序的内存组成 地址区域 作用 代码区 存放程序的代码,即CPU执行的机器指令,并且是只读的。 常量区 存放常量(程序在运行的期间不能够被改变的量,例如: 10,字符串常量”abcde”, 数组的名字等) 静态区(全局区) 静态变量和全局变量的存储区域是一起的,一旦静态区的内存被分配, 静态区的内存直到程序全部结束之后才会被释放 堆区 由程序员调用malloc()函数来

q742971636的博客 2911

C和C++中const变量内存分配问题详解

一、const变量的内存分配 1.const全局变量,或者static,extern 关键字 此时该常量是存放在.rodata段的—Read Only Data也就是常量区,是无法通过取地址方式去修改的,修改内容会报段错误(gcc++编译器:Segmentation fault(core dumped))。   例如extern const int i=10,   static const int i=10。 2.const局部变量 在C语言中,const局部变量在栈分配内存,不能通过赋值,自

u014157109的博客 8014

C语言程序里全局变量、局部变量、堆、栈等概念

一、介绍 全局变量、静态局部变量保存在全局数据区,初始化的和未初始化的分别保存在一起。普通局部变量保存在堆栈中。 在C\C++中,通常可以把内存理解为4个分区:栈、堆、全局/静态存储区和常量存储区 栈区(stack):指那些由编译器在需要的时候分配,不需要时自动清除的变量所在的储存区,如函数执行时,函数的形参以及函数内的局部变量分配在栈区,函数运行结束后,形参和局部变量去栈(自动释放)。栈内存分配运算内置与处理器的指令集中,效率高但是分配的内存空间有限。 堆区(heap):指哪些由程序员手动分配释放的储存区

m0_47014382的博客 3092
上一篇: 【数据结构】树(堆、哈夫曼树、二叉排序树、AVL树、)(更新中....)
下一篇: 【算法】排序算法总结
ProcedureStone
博客等级 码龄4年 254粉丝 64原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值