当前位置: 首页 > article >正文

C++零基础到工程实战(4.3.2):栈区与堆区数组代码演示

目录一、本节学习内容概要二、前言三、栈区数组代码演示3.1 栈区数组定义3.2 值访问与地址访问3.3 栈区数组大小计算3.4 栈区数组必须是编译时常量四、堆区数组代码演示4.1 基本定义与访问4.2 值与地址访问4.3 手动释放4.4 堆区数组动态大小示例4.5 memcpy 拷贝示例五、栈区 vs 堆区对比六、扩展点6.1 栈区数组过大可能溢出6.2 堆区数组不释放会泄漏6.3 栈 vs 堆地址方向七、完整示例代码八、本节小结一、本节学习内容概要栈区数组创建与内存分配堆区数组创建与手动释放栈 vs 堆内存地址打印栈区与堆区数组访问示例大小计算与 sizeof 使用面试常考点与注意事项二、前言在上一节我们了解了数组的本质、访问方式以及栈区、堆区数组和 vector 的区别。本节的重点是通过代码演示栈区和堆区数组的值访问、地址访问、十六进制打印、整型转换以及memcpy拷贝操作让概念落地到实际代码顺带掌握工程实践要点。以帮助你理解“连续内存 地址计算 值访问”。三、栈区数组代码演示3.1 栈区数组定义int arr[5] {10, 20, 30, 40, 50};✅ 特点在函数作用域内定义内存分配在栈区系统自动释放3.2 值访问与地址访问for (int i 0; i 5; i) { cout arr[ i ] arr[i] , arr[ i ] arr[i] , arr i arr i , *(arr i ) *(arr i) endl; }arr[i]和*(arr i)获取元素值arr[i]和arr i获取元素地址地址连续每个 int 占 4 字节假设#include iostream using namespace std; int main() { int arr[5] {10, 20, 30, 40, 50}; cout 栈区数组首地址: arr endl; for (int i 0; i 5; i) { cout arr[ i ] arr[i] , 地址: (arr i) endl; } return 0; } 输出解析✅ 可以看到地址是连续的每个元素占 4 字节intarr本身是首地址arr i和arr[i]等价面试点栈区数组自动释放不需要手动 delete3.3 栈区数组大小计算cout 整个数组大小: sizeof(arr) 字节 endl; cout 单个元素大小: sizeof(arr[0]) 字节 endl; cout 数组元素数量: sizeof(arr)/sizeof(arr[0]) endl;✅ 说明sizeof(arr)返回整个数组占用的字节sizeof(arr[0])返回单个元素大小sizeof(arr)/sizeof(arr[0])得到元素数量3.4 栈区数组必须是编译时常量int size 5; const int csize 5; //编译时常量 const int csize2 size; //运行时常量 constexpr int cesize 5; //编译时常量 int arr3[csize]; int arr4[cesize];栈区数组大小必须是编译时常量constexpr不支持运行时变量定义。四、堆区数组代码演示4.1 基本定义与访问int* arr2 new int[5]{10,20,30,40,50};✅ 特点分配在堆区手动管理内存大小可在运行时确定4.2 值与地址访问cout 堆区数组首地址: arr2 endl; for (int i 0; i 5; i) { cout arr2[ i ] arr2[i] , 地址: (arr2 i) endl; }//数组遍历存放的数组首地址 cout arr1 (long long)arr1 endl; // arr1[0]十六进制 (long long)arr1[0]十六进制转十进制整型方式 cout arr1[0] (long long)arr1[0] endl; cout arr1[1] (long long)arr1[1] endl; cout arr1[2] (long long)arr1[2] endl; cout arr1[3] (long long)arr1[3] endl; cout arr1 2 (long long)(arr1 2) endl; cout arr1 3 (long long)(arr1 3) endl;✅ 输出解析地址也是连续的但不与栈区相关与栈区相比分配速度稍慢但灵活4.3 手动释放delete[] arr2; arr2 nullptr; // 避免悬空指针面试点堆数组必须手动释放否则内存泄漏4.4 堆区数组动态大小示例int n; cin n; int* arr3 new int[n]; for (int i 0; i n; i) arr3[i] i * 10; delete[] arr3;✅ 可以根据用户输入动态分配堆内存这一点是栈区数组无法做到的。4.5 memcpy 拷贝示例int* arr2 new int[5]{10, 20, 30, 40, 50}; int arr_copy[5]; memcpy(arr_copy, arr2, 5 * sizeof(int)); cout 复制后的栈区数组 arr_copy: ; for(int i 0; i 5; i) cout arr_copy[i] ; cout endl;快速复制数组内容可实现栈-堆或堆-堆五、栈区 vs 堆区对比特性栈区数组堆区数组内存位置栈堆生命周期自动手动大小编译期固定运行期可变内存释放自动delete[]必须手动值访问arr[i], *(arri)arr[i], *(arri)地址访问arr[i], arriarr[i], arri内存连续性是是面试考点自动释放地址连续手动释放地址连续memcpy使用六、扩展点6.1 栈区数组过大可能溢出栈通常只有几十 KB大数据请用堆或 vector6.2 堆区数组不释放会泄漏工程实践建议使用智能指针或 vector6.3 栈 vs 堆地址方向栈从高地址向低地址增长堆从低地址向高地址增长可以通过打印地址观察七、完整示例代码#include iostream using namespace std; int main() { //栈区数组 { //类型 变量名[数组数量] int arr1[4]{ 0 }; //c11 for循环遍历 for (int a : arr1) //int a:arr1 : 每次循环创建一个新的int类型变量a 创建变量a让他一次等于arr1[0]...arr1[3] cout a ; cout endl; arr1[0] 99; //下标从0 arr1[2] 88; for (int a : arr1) cout a ; cout endl; cout sizeof(arr1) sizeof(arr1) endl; // 一个int类型是4个字节 4个是16字节 for (int i 0; i sizeof(arr1)/sizeof(int);i) { cout arr1[i] ,; } cout endl; int arr2[4]; //未初始化 值不确定 //c11 for循环遍历 for (int a : arr2) cout a ; cout endl; //栈区数组空间只能用编译时常量 int size 5; const int csize 5; //编译时常量 const int csize2 size; //运行时常量 constexpr int cesize 5; //编译时常量 int arr3[csize]; int arr4[cesize]; //栈区数组的初始化不加大小时数组会根据初始化内容自己定义大小 int arr5[10] { 1,2,3,4,5 }; int arr6[] { 3,4,5,6,7,8 }; char arr7[] test string; //字符串结尾还有个/0 一个字母一字节 所以共12字节 cout sizeof(arr6) sizeof(arr6) endl; cout sizeof(arr7) sizeof(arr7) endl; //数组是地址连续的空间 //数组遍历存放的数组首地址 cout arr1 (long long)arr1 endl; // arr1[0]十六进制 (long long)arr1[0]十六进制转十进制整型方式 cout arr1[0] (long long)arr1[0] endl; cout arr1[1] (long long)arr1[1] endl; cout arr1[2] (long long)arr1[2] endl; cout arr1[3] (long long)arr1[3] endl; cout arr1 2 (long long)(arr1 2) endl; cout arr1 3 (long long)(arr1 3) endl; cout *(arr1 2) *(arr1 2) endl; } { int arr1[4]{ 0 }; } { //堆区数组 int* arr1 new int[4] {0}; // 堆区空间大小必须分配 不能像栈区那样自动分配 auto arr2 new int[4] {1, 2, 3, 4}; cout sizeof(arr1) sizeof(arr1) endl; // sizeof对于堆区数组只是拿到指针大小 这里是8 int size 10; auto arr3 new int[size] {0}; // 空间大小可以通过变量运行时确定 而栈区数组得编译时确定 // size大小可控制 但是不能用C11得循环 也不能直接获取大小 实际字节大小 size*int for (int i 0; i size; i) { cout arr3[i] |; } cout endl; delete[] arr1; arr1 nullptr; delete[] arr2; arr2 nullptr; delete[] arr3; arr3 nullptr; // delete过后 数组(arr1)的地址并没有变化仍然指向原来的空间但原来空间的内存已经被释放 继续访问就是未知错误 int arr5[5] { 1,2,3,4,5 }; auto* arr6 new int[5]; // 内存复制 memcpy(目标数组被复制的数组首地址复制字节) memcpy(arr6, arr5, sizeof(arr5)); for (int i 0; i 5; i) cout arr6[i] -; cout endl; delete[]arr6; arr6 nullptr; } }八、本节小结栈区数组简单、快速、自动释放但大小固定堆区数组灵活、可动态分配但必须手动释放访问方式栈和堆一致arr[i]/arr i面试提示打印地址可观察栈/堆增长方向

相关文章:

C++零基础到工程实战(4.3.2):栈区与堆区数组代码演示

目录 一、本节学习内容概要 二、前言 三、栈区数组代码演示 3.1 栈区数组定义 3.2 值访问与地址访问 3.3 栈区数组大小计算 3.4 栈区数组必须是编译时常量 四、堆区数组代码演示 4.1 基本定义与访问 4.2 值与地址访问 4.3 手动释放 4.4 堆区数组动态大小示例 4.5 …...

终极指南:三步快速打造你的英雄联盟智能助手ChampR

终极指南:三步快速打造你的英雄联盟智能助手ChampR 【免费下载链接】champr 🐶 Yet another League of Legends helper 项目地址: https://gitcode.com/gh_mirrors/ch/champr 还在为每次游戏都要手动查找出装符文而烦恼吗?还在因为版本…...

手把手教你用Arduino IDE给自制STM32板子(比如RUMBA32)烧写程序,解决编译Marlin固件报错

从零构建STM32开发环境:Arduino IDE实战指南与Marlin固件编译排错 最近在折腾自制3D打印机主板时,发现用Arduino IDE给STM32芯片烧录程序远没有想象中简单。特别是当你用的不是标准开发板,而是自己设计的定制板型时,各种环境配置问…...

开源项目管理利器OpenProject:从零构建高效团队协作平台

开源项目管理利器OpenProject:从零构建高效团队协作平台 【免费下载链接】openproject OpenProject is the leading open source project management software. 项目地址: https://gitcode.com/GitHub_Trending/op/openproject 在当今快节奏的工作环境中&…...

Go-CQHTTP技术架构深度解析:基于Golang的QQ机器人框架实现原理

Go-CQHTTP技术架构深度解析:基于Golang的QQ机器人框架实现原理 【免费下载链接】go-cqhttp cqhttp的golang实现,轻量、原生跨平台. 项目地址: https://gitcode.com/gh_mirrors/go/go-cqhttp Go-CQHTTP作为cqhttp协议的Golang原生实现,…...

3步解锁加密音乐:Unlock Music让你的音乐在任何设备自由播放

3步解锁加密音乐:Unlock Music让你的音乐在任何设备自由播放 【免费下载链接】unlock-music 在浏览器中解锁加密的音乐文件。原仓库: 1. https://github.com/unlock-music/unlock-music ;2. https://git.unlock-music.dev/um/web 项目地址:…...

DeepPCB:工业级PCB缺陷检测数据集的工程化实践指南

DeepPCB:工业级PCB缺陷检测数据集的工程化实践指南 【免费下载链接】DeepPCB A PCB defect dataset. 项目地址: https://gitcode.com/gh_mirrors/de/DeepPCB 印刷电路板(PCB)作为现代电子设备的"神经系统",其质量…...

实战指南:在自定义数据集上微调Gold-YOLO-Nano,兼顾精度与速度(环境配置+训练技巧)

实战指南:在自定义数据集上微调Gold-YOLO-Nano,兼顾精度与速度 当目标检测遇上边缘计算设备,开发者们总在寻找那个微妙的平衡点——既要模型足够轻量以适应资源限制,又要保持足够的精度满足业务需求。Gold-YOLO-Nano作为NeurIPS …...

不只是仿真:解锁Icarus Verilog (iverilog) 在Windows上的三个隐藏用法(语法检查/转VHDL/库管理)

解锁Icarus Verilog在Windows中的高阶应用:从语法检查到混合语言开发 在数字电路设计领域,Verilog作为主流硬件描述语言之一,其开发工具链的灵活运用往往能大幅提升工作效率。虽然大多数工程师熟悉Icarus Verilog(iverilog&#x…...

深入pdf.js源码:从‘传参’看C#如何灵活控制PDF渲染(url vs data流实战)

深入pdf.js源码:从‘传参’看C#如何灵活控制PDF渲染(url vs data流实战) 在C#全栈开发中,PDF文件的动态渲染一直是业务系统的高频需求。当基础功能无法满足复杂场景时,开发者往往陷入两难:要么依赖现成解决…...

MPU6050 DMP库移植踩坑全记录:从I2C通信失败到欧拉角飘移的解决方案

MPU6050 DMP库移植实战:从硬件调试到数据优化的完整解决方案 1. 硬件连接与I2C通信问题排查 移植MPU6050 DMP库时,硬件连接问题往往是最先遇到的障碍。许多开发者习惯直接复制原理图,却忽略了几个关键细节: 上拉电阻配置误区 I…...

B站字幕下载终极指南:3分钟学会免费提取CC字幕的完整方法

B站字幕下载终极指南:3分钟学会免费提取CC字幕的完整方法 【免费下载链接】BiliBiliCCSubtitle 一个用于下载B站(哔哩哔哩)CC字幕及转换的工具; 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBiliCCSubtitle 还在为无法保存B站视频字幕而烦恼吗&#xf…...

别再死记硬背了!用这5个真实业务场景彻底搞懂Flink Watermark与状态管理

别再死记硬背了!用这5个真实业务场景彻底搞懂Flink Watermark与状态管理 最近在技术社区看到不少开发者抱怨Flink的状态管理和时间语义太难理解——文档里的概念像"Watermark"、"Checkpoint"、"Keyed State"看着都认识,一…...

Fan Control完整教程:Windows风扇智能控制终极指南

Fan Control完整教程:Windows风扇智能控制终极指南 【免费下载链接】FanControl.Releases This is the release repository for Fan Control, a highly customizable fan controlling software for Windows. 项目地址: https://gitcode.com/GitHub_Trending/fa/Fa…...

3大核心功能完全掌握:electerm跨平台远程管理终极指南

3大核心功能完全掌握:electerm跨平台远程管理终极指南 【免费下载链接】electerm 📻Terminal/ssh/sftp/ftp/telnet/serialport/RDP/VNC/Spice client(linux, mac, win) 项目地址: https://gitcode.com/gh_mirrors/el/electerm 你是否厌倦了在不同…...

FPGA开发效率翻倍!Quartus II 这几个隐藏设置和窗口管理技巧,你知道吗?

FPGA开发效率翻倍!Quartus II 这几个隐藏设置和窗口管理技巧,你知道吗? 作为一名FPGA开发者,你是否经常在Quartus II中感到效率低下?界面混乱、窗口丢失、重复操作消耗大量时间?今天我要分享的这几个隐藏技…...

想用Anti-UAV数据集练手无人机跟踪?这份保姆级下载、标注与使用指南请收好

Anti-UAV数据集实战:从零开始掌握无人机多模态跟踪技术 无人机跟踪技术正在成为计算机视觉领域的热点研究方向。对于刚接触这个领域的研究者和开发者来说,Anti-UAV数据集提供了一个绝佳的实践平台。这个多模态数据集不仅包含常规的RGB视频,还…...

打造专属瑜伽海报!雯雯的后宫-造相Z-Image模型在内容创作中的实战应用

打造专属瑜伽海报!雯雯的后宫-造相Z-Image模型在内容创作中的实战应用 1. 引言:AI瑜伽海报创作新体验 在内容创作领域,视觉素材的重要性不言而喻。对于瑜伽教练、健康博主和内容创作者来说,高质量的专业瑜伽图片往往是稀缺资源。…...

别再硬算偏微分方程了!用Python和PyTorch搭建你的第一个PINN模型(附完整代码)

用Python和PyTorch实战物理信息神经网络:从零搭建PINN模型求解Burgers方程 在传统数值计算领域,求解偏微分方程往往需要复杂的网格划分和迭代计算。但今天,我们将探索一种革命性的方法——物理信息神经网络(PINN)&…...

告别纯CNN时代?从YOLOv12的‘区域注意力’看目标检测架构的融合趋势

YOLOv12如何重新定义实时目标检测的边界 当YOLOv12在T4 GPU上以1.64毫秒的推理速度实现40.6%的mAP时,整个计算机视觉社区都意识到:实时目标检测的游戏规则正在被改写。这不仅仅是另一个增量式改进,而是标志着注意力机制首次在实时检测领域真正…...

Rust Trait 对象的内存布局

Rust Trait对象的内存布局探秘 Rust作为一门注重安全与性能的系统级语言,其Trait对象是实现运行时多态的核心机制。理解Trait对象的内存布局,不仅能帮助开发者写出更高效的代码,还能避免因类型擦除带来的潜在问题。本文将深入剖析Trait对象在…...

PVE里Windows Server卡成PPT?别急着换硬件,先检查这两个虚拟设备

PVE环境下Windows Server性能优化实战:从卡顿到流畅的关键策略 如果你在PVE虚拟化平台上运行Windows Server时遭遇了令人抓狂的卡顿——远程桌面像翻PPT一样迟缓,系统响应慢得让人怀疑人生,甚至怀疑是不是该升级硬件了。别急着下单买新设备&…...

LeagueAkari:英雄联盟玩家的终极效率工具,3大核心技术革新游戏体验

LeagueAkari:英雄联盟玩家的终极效率工具,3大核心技术革新游戏体验 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit Lea…...

Python 协程任务分发架构设计

Python协程任务分发架构设计:高并发处理的优雅之道 在当今高并发的互联网场景下,如何高效处理海量异步任务成为开发者关注的焦点。Python的协程机制,凭借轻量级线程和事件循环的特性,为任务分发提供了全新思路。通过协程架构设计…...

你的Unity项目卡顿吗?可能是模型面数超标了!用这个脚本快速排查性能瓶颈

Unity性能优化实战:如何快速揪出模型面数超标的"性能杀手" 当你的Unity项目开始出现卡顿、加载缓慢或内存占用过高时,模型面数往往是首要怀疑对象。一个高面数模型可能拖垮整个场景的性能表现,特别是在移动端或VR设备上。本文将分享…...

Figma中文汉化插件终极指南:3分钟告别英文界面困扰

Figma中文汉化插件终极指南:3分钟告别英文界面困扰 【免费下载链接】figmaCN 中文 Figma 插件,设计师人工翻译校验 项目地址: https://gitcode.com/gh_mirrors/fi/figmaCN 还在为Figma的英文界面而烦恼吗?作为一名中文设计师&#xff…...

UE5蓝图实战:用VaRest插件5分钟搞定天气API调用与JSON数据解析

UE5蓝图实战:用VaRest插件5分钟搞定天气API调用与JSON数据解析 在游戏开发中,实时数据集成已经成为提升玩家体验的重要手段之一。想象一下,你的开放世界游戏能够根据现实世界的天气变化动态调整游戏内的气候效果,或者你的城市模拟…...

Windows文件管理新境界:ApkShellext2让应用包文件一目了然

Windows文件管理新境界:ApkShellext2让应用包文件一目了然 【免费下载链接】apkshellext Show app icons in windows explorer 项目地址: https://gitcode.com/gh_mirrors/ap/apkshellext 在Windows资源管理器中,您是否曾为区分各种应用包文件而…...

Mac上Maven编译报错?别急着换Lombok版本,先检查你的JDK和Maven版本匹配

Mac上Maven编译报错?别急着换Lombok版本,先检查你的JDK和Maven版本匹配 作为一名长期在MacOS环境下进行Java开发的工程师,我遇到过无数次Maven编译报错的情况。其中最令人头疼的莫过于java.lang.ExceptionInInitializerError: com.sun.tools.…...

别再只用默认样式了!Element UI el-tag 的 5 种高级玩法,让你的后台标签更出彩

解锁Element UI el-tag的5种高阶玩法:让后台标签设计脱颖而出 在后台管理系统开发中,标签组件看似简单却承担着关键的信息分类与状态展示功能。Element UI的el-tag组件提供了开箱即用的基础样式,但大多数开发者仅停留在type/size等基础属性的…...