|
在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,堆栈是一个很模糊的概念。堆栈:一种数据结构、一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆栈一词混为一谈。我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不清堆栈,所以我想有必要给大家分享一下我对堆栈的看法,有说的不对的地方请朋友们不吝赐教,这对于大家学习会有很大帮助。
首先在数据结构上要知道堆栈,尽管我们这么称呼它,但实际上堆栈是两种数据结构:堆和栈。
堆和栈都是一种数据项按序排列的数据结构。
我们先从大家比较熟悉的栈说起吧,它是一种具有后进先出性质的数据结构,也就是说后存放的先取,先存放的后取。这就如同我们要取出放在箱子里面底下的东西(放入的比较早的物体),我们首先要移开压在它上面的物体(放入的比较晚的物体)。而堆就不同了,堆是一种经过排序的树形数据结构,每个结点都有一个值。通常我们所说的堆的数据结构,是指二叉堆。堆的特点是根结点的值最小(或最大),且根结点的两个子树也是一个堆。由于堆的这个特性,常用来实现优先队列,堆的存取是随意,这就如同我们在图书馆的书架上取书,虽然书的摆放是有顺序的,但是我们想取任意一本时不必像栈一样,先取出前面所有的书,书架这种机制不同于箱子,我们可以直接取出我们想要的书。
然而我要说的重点并不在这,我要说的堆和栈并不是数据结构的堆和栈,之所以要说数据结构的堆和栈是为了和后面我要说的堆区和栈区区别开来,请大家一定要注意。
下面就说说C语言程序内存分配中的堆和栈,这里有必要把内存分配也提一下,大家不要嫌我啰嗦,一般情况下程序存放在Rom或Flash中,运行时需要拷到内存中执行,内存会分别存储不同的信息,如下图所示:
内存中的栈区处于相对较高的地址以地址的增长方向为上的话,栈地址是向下增长的,栈中分配局部变量空间,堆区是向上增长的用于分配程序员申请的内存空间。另外还有静态区是分配静态变量,全局变量空间的;只读区是分配常量和程序代码空间的;以及其他一些分区。
来看一个网上很流行的经典例子:
main.cpp
1.申请后系统的响应
栈:只要栈的剩余空间大于所申请空间,系统将为程序提供内存,否则将报异常提示栈溢出。
堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆。
2.申请效率的比较
栈:由系统自动分配,速度较快。但程序员是无法控制的。
堆:是由new分配的内存,一般速度比较慢,而且容易产生内存碎片,不过用起来最方便。
3.申请大小的限制
5.存取效率的比较
堆和栈的区别可以引用一位前辈的比喻来看出: |
相关推荐
GLM-5对齐Claude Opus 4.5:国产编程AI的工程语义突破
编程大模型不是参数堆砌,而是对工程语义的深度建模能力——它需理解TypeScript接口契约、React依赖数组副作用、Python异步上下文生命周期等真实开发语义。GLM-5通过代码变更序列训练、终端交互日志学习与动态稀疏注意力(DSA)机制,在SWE-bench-Verified和Terminal Bench 2.0等权威测试中逼近Claude Opus 4.5,实现从‘能写代码’到‘懂工程决策’的跃迁。其技术价值在于将长上下文(202K tokens)、低显存占用(3.2GB GPU)与高精度归因能力
linux环境下查看C/C++程序的堆栈信息
文章目录前言测试环境查看方法具体实践gdb调试core文件gdb附加到进程pstack输出堆栈信息strace打印程序运行情况总结 前言 经常在Windows上开发的工程师们可能已经习惯了图形化的调试界面,在源代码的编辑框上点击就可以添加断点,在调用堆栈的窗口就可以看到程序运行的堆栈信息,但是在 linux 环境下,面对命令行的天下,我们需要掌握一些命令,才能够查看C/C++程序的堆栈信息。 测...
Grok Build:原生命令行AI助手,专注终端意图理解与执行
命令行AI助手是面向开发者提升终端效率的关键技术,其核心在于对shell输入意图的精准识别与跨工具语义理解。不同于依赖远程API或GUI封装的方案,真正的命令行原生AI需深入进程级输入捕获、本地化领域知识图谱构建及安全隔离执行机制。Grok Build通过ptrace注入、CLI参数组合建模、离线轻量模型等设计,实现对git/kubectl/docker等工具链的深度语义解析与故障诊断。它适用于SRE根因分析、基础设施自动化、DevOps脚本增强等高价值场景,让历史命令、报错日志和部署意图在纯文本界面中获得
c++程序内存布局以及堆栈概念详解
前言: 下图是c/c++的进程的内存分布布局图,搞清楚内存布局对于理解一个程序是非常重要的。 一个程序运行起来,操作系统会给每个进程分配一个 4G 的程序地址空间,当然这都是虚拟地址空间,因为如果一个进程分 4G 的内存,那么就算有再多的内存也不够分。 这些虚拟地址空间中的内存分段都是什么意思呢?下面进行讲解(linux系统为1G和3G,windows系统为2G和2G): 一、首先进程地址空间的 1G(windows系统为2G) 内核空间是给操作系统使用的,我们用户是没有操作...
拼多多Android面试题及参考答案
Android 系统采用分层架构设计,从底层到上层依次为Linux 内核层硬件抽象层(HAL)系统运行时库层应用框架层应用层,共五层。位置:Linux 内核层与系统运行时库层之间,是“硬件与系统的隔离层”。核心作用:屏蔽硬件差异,为上层提供统一的硬件访问接口,解决 Android 开源与硬件厂商闭源的矛盾,具体功能如下:硬件能力抽象:将硬件的具体实现(如不同厂商的摄像头芯片、音频芯片)封装为标准化接口(如Camera HALAudio HAL。
CocosCreator视频播放黑屏?手把手教你封装VideoPlayer组件解决Web环境问题
本文针对Cocos Creator在Web环境下视频播放黑屏等常见问题,提供了一套工程化的VideoPlayer组件封装解决方案。文章深入剖析了浏览器自动播放策略、DOM样式隔离等核心挑战,并手把手教你实现一个健壮的管理器,涵盖兼容性处理、性能优化与内存管理,确保视频播放稳定流畅。
堆和栈的区别
在顶嵌上看到得这篇文章,很有参考价值。 在计算机领域,堆栈是一个不容忽视的概念,我们编写的C语言程序基本上都要用到。但对于很多的初学着来说,堆栈是一个很模糊的概念。堆栈:一种数据结构、一个在程序运行时用于存放的地方,这可能是很多初学者的认识,因为我曾经就是这么想的和汇编语言中的堆栈一词混为一谈。我身边的一些编程的朋友以及在网上看帖遇到的朋友中有好多也说不清堆栈,所以我想有必要给大家分享一
SAP MIRO发票自动化:BAPI_INCOMINGINVOICE_CREATE实战解析
本文深入解析了如何使用SAP标准BAPI_INCOMINGINVOICE_CREATE实现MIRO发票校验流程的自动化。通过实战代码示例,详细阐述了从采购订单和收货凭证获取数据、构建BAPI核心参数、处理常见错误到高级场景优化的完整路径,旨在帮助SAP开发人员构建稳定、高效的自动化解决方案,提升财务处理效率与准确性。
C++/C的堆栈理解
前言:我们经常听见一个概念,堆(heap)和栈(stack),其实在数据结构中也有同样的这两个概念,但是这和内存的堆栈是不一样的东西哦,本文也会说明他们之间的区别的,另外,本文的只是是以C/C++为背景来说明,不同的语言在内存管理上面会有区别。 一、数据结构中的堆与栈 数据结构中,堆(heap)与栈(stack)是两个常见的数据结构,理解二者的定义、用法与区别,能够利用堆与栈解决很多实际问题。 1.1 栈简介 栈是一种运算受限的线性表,其限制是指只仅允许在表的一端进行插入和删除...
海康VM加密狗无法识别常见问题排查
海康VM加密狗无法识别常见问题排查
人工智能100问☞第5问:什么是AI三要素?
人工智能的核心三要素是数据、算法和算力,分别作为AI的“燃料”、“大脑”和“动力”,三者协同驱动智能系统的学习、推理与决策能力。
【C++】详解内存中的堆和栈
2023年8月20日,周日早上感觉很多东西还没吃透,很多疑问还没解决。这篇文章可能会不定期更新。堆和栈都是内存中的一部分,或者说,堆和栈属于内存空间。
NXP KW47蓝牙MCU低功耗实测:从8μA睡眠到5年续航的优化实战
在物联网和嵌入式系统开发中,低功耗设计是决定电池供电设备续航能力的关键技术。其核心原理在于通过事件驱动、状态机管理和精细的电源域控制,使设备在空闲时进入深度睡眠,仅在需要时快速唤醒工作,从而将平均电流从毫安级降至微安级。这项技术的工程价值在于能够实现纽扣电池供电设备长达数年的使用寿命,广泛应用于智能家居传感器、可穿戴设备、资产追踪和工业监测等领域。以NXP KW47系列无线MCU为例,其集成的Arm Cortex-M33双核与专用射频单元,配合多级睡眠模式和高效DC-DC转换器,为超低功耗蓝牙应用提供了硬件
二、JVM相关
定义:JVM内存模型可以分为线程共享区域(堆、方法区)和线程私有区域(程序计数器、虚拟机栈以及本地方法区)以及直接内存三大块,其中线程共享区域和线程私有区域又被称作运行时数据区域(Runtime Data Area)示意图JVM内存模型和Java内存模型(JMM)的区别**扩展:**与操作系统相对于硬件类似,操作系统需要抽象出内存模型,那么 Java语言也需要抽象出相对于操作系统的内存模型,这就是Java内存模型(JMM)。
python123题目——判断火车票座位B(异常)
类型:流程控制。
【Bug已解决】codex: rate limit 429 / Too many requests / RPM exceeded — CodeX CLI 速率限制解决方案
CodeX CLI 触发 429 速率限制(RPM/TPM/并发)的解决方案,含请求间隔、自动重试、便宜模型、Tier 升级与多 Key 轮换。
VPS生命周期操作系统:监控建站维护一体化方案
VPS(虚拟专用服务器)作为个人开发者与小微团队的核心基础设施,其稳定运行依赖于监控、建站、维护三大能力的深度协同。传统方案将三者割裂为独立工具链,导致配置冗余、故障归因困难、环境适配低效。本文介绍的VPS生命周期操作系统,以轻量Agent实现业务语义感知监控,以契约式交互驱动建站决策,以场景化策略支撑自动化维护,并深度适配甲骨文ARM等主流免费云平台。它融合ZRAM内存管理、DNS双路缓存、bfq IO调度等关键技术,将运维从‘救火响应’升维为‘生存自治’。关键词涵盖VPS监控、一键建站、自动化运维、AR
YOLOv8改进策略【Neck】| CVPR 2024 MFM(Modulation Fusion Module,调制融合模块):动态特征加权融合,突出关键特征抑制冗余
本文主要利用DCMPNet中的 MFM 模块优化 YOLOv8 的目标检测网络模型。模块通过动态调制特征融合过程,实现了对多尺度、跨层级特征的智能聚合。将其应用于的改进过程中,针对目标检测中边界特征与语义信息的互补性需求,缓解网络中浅层细节与深层语义融合不足的问题。Depth Information Assisted Collaborative Mutual Promotion Network for Single Image Dehazing在图像去雾网络中,不同层级和类型的特征包含着互补的信息(如浅层的
【面试】搞定面试就这么简单!!!
参数化类型”,类型由具体的类型参数化,把类型也定义成参数形式(称之为类型形参),然后在使用/调用时传入具体的类型(类型实参)。泛型的本质是把参数的类型参数化,也就是所操作的数据类型被指定为一个参数,这种参数类型可以用在类、接口和方法中。使用泛型编写的程序代码,要比使用 Object 变量再进行强制类型转换的代码,具有更好的安全性和可读性。多种数据类型执行相同的代码使用泛型可以复用代码// 定义一个泛型方法,用于打印数组元素// 创建一个 Integer 数组。
深度学习工具包 DeepLearningToolbox
深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[](https://bitdeli.com/free "Bitdeli Badge")
LinePhone3.2.7(android端最新版本) sip客户端
SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/
147.【2024Java八股-全网最全-10w字】
eg: 学校、院校、经验、年龄、跳槽频率…基本包括16种常见使用场景: 、数据共享分布式、、全局 ID、计数器、限流、位统计、购物车、用户消息时间线 timeline、、抽奖、点赞、签到、打卡、商品标签、商品筛选、用户关注、推荐模型、排行榜.详细讲解16种使用场景: https://blog.csdn.net/zxl646801924/article/details/123202381用户使用id进行查询文章的时候,首先会查询redis数据库,如果在redis中命中数据,那么redis就向用户返回查询的结果
android 蓝牙通讯demo
android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。
并行分布式框架:Celery、rq、funboost
Celery是一个异步任务的调度工具,也可以叫做 "分布式任务队列(Distributed Task Queue)"。
Probability and Statistics - 4th edition
Probability and Statistics - 4th edition
爬虫教程( 2 ) --- scrapy 教程、可视化管理工具、反爬框架、ai 爬虫
scrapy 教程、可视化管理工具、反爬框架、ai 爬虫
练功秘籍---A
常用整理
Hermes Agent:基于学习循环与技能系统的自我进化Agent操作系统
Agent(智能体)作为大模型落地的核心范式,正从静态工具调用迈向动态能力演进。其核心原理在于构建可观察、可反馈、可迭代的执行闭环——即学习循环(Learning Loop),通过观察、反思、规划、执行四阶段驱动系统持续优化。技术价值体现在打破传统框架中能力硬编码、错误修复高成本、技能复用率低等工程瓶颈,实现以技能为原子单元的模块化、类型安全、可验证的能力治理。典型应用场景覆盖客服自动化、知识库问答、多步骤业务编排等需长期迭代的生产环境。本文深入解析Hermes Agent如何将这一理念转化为可运行、可调试
flutter学习笔记
1.跨平台移动UI框架2.与现有的代码一起工作(可以直接嵌入到原生代码中或直接把原生代码嵌入到自己的代码中运行)3. 完全免费、开源。
shell常实用命令
利用ssh远程执行服务器命令 fuction expect_server() { expect <<EOF set timeout 1000 spawn $@ expect { "(yes/no)?" {send "yes\r"; exp_continue} "asswor*" {send "${SERVER_PASSWD}\r"; exp_continue} eo...

473



被折叠的 条评论
为什么被折叠?



