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

C++ 创建静态数组出现栈满程序崩溃的问题

C++ 创建静态数组出现栈满程序崩溃的问题

问题:

在C++中,在函数中创建一个比较大的数组,会导致程序崩溃无法运行。
如:

#include<iostream>
#include<vector>

const int MAX_N = 100000 + 10; 

int main(){
	vector<int> arr[MAX_N];		// 会导致程序根本无法运行
	cout<<"I am a array"<<endl;	// 这行代码更不会输出!
	return 0;
}

原因解释:

数组的内存分配机制:

  • 如果是静态数组,如int arr[10],会直接分配在中,栈的空间通常很小,通常为 1~8MB

    栈(Stack) 是程序运行时用于存储局部变量和函数调用上下文的内存区域。它的大小通常由操作系统或编译器限制,默认栈空间很小(通常为 1 ~ 8MB)。

  • 如果动态数组,如int* arr = new int[10],会直接分配在中,堆支持动态内存扩展,就一般情况而言,堆不会出现满的状况,除非内存满了,注意:堆空间需要手动维护也就是在不适用是需要手动释放内存。
    动态数组的形式:
    // 情况一:
    int* arr = (int*) malloc(sizeof(int) * 10);
    // 释放
    free(arr)
    
    // 情况二:
    int* arr = (int*) new int[10];
    // 释放
    delete[] arr;
    
    // 情况三:(不需要手动维护)
    vector<int> arr(10);
    
  • 静态数组全局定义:将静态数组定义在函数外部,此时静态数组存储的位置变为了一个全局变量,对于全局变量有:全局变量存储在数据段(Data Segment)或 BSS 段中,这些区域的内存空间远大于栈。因此,即使数组非常大(如 100,010 个元素),全局变量的内存分配也不会导致栈溢出。
    1. 数据段和BSS段都是用来存储全局变量和静态变量的,但根据变量是否初始化以及初始化的值来区分两者。
    2. 数据段用于存储已初始化的数据,而BSS段则用于存储未初始化的数据或是初始化为0的数据.这意味着BSS段比数据段更节省磁盘空间,因为它不需要存储实际的初始值,仅需记录需要多少空间来存放这些变量即可。
http://www.dtcms.com/a/121532.html

相关文章:

  • 【虚拟机栈中的栈帧是什么?有什么作用?局部变量表、操作数栈、动态链接和方法返回地址是什么?有什么作用?为什么要放在栈帧里?】
  • Ubuntu24.04 编译 Qt 源码
  • 一个可以在Android手机上运行的Linux高仿window10的应用
  • Python中的AdaBoost分类器:集成方法与模型构建
  • VT01N/VT02N进行交货的时候,对装运点加权限控制的增强
  • 原生SSE实现AI智能问答+Vue3前端打字机流效果
  • 【语法】C++的list
  • 模糊测试究竟在干什么
  • 41、web前端开发之Vue3保姆教程(五 实战案例)
  • 结合大语言模型整理叙述并生成思维导图的思路
  • C语言--常用的链表操作
  • 分布式存储怎样提高服务器数据的安全性?
  • Vue3+Vite+TypeScript+Element Plus开发-09.登录成功跳转主页
  • CentOS8.5 LLaMA-Factory训练模型
  • ChatDBA:一个基于AI的智能数据库助手
  • 基于C8051F340单片机的精确定时1S的C程序
  • 代码随想录算法训练营--打卡day8
  • 状态同步梳理
  • 如何精准控制大模型的推理深度
  • 解密工业控制柜:认识关键硬件(PLC)
  • NO.84十六届蓝桥杯备战|动态规划-路径类DP|矩阵的最小路径和|迷雾森林|过河卒|方格取数(C++)
  • Stable Diffusion + Contronet,调参实现LPIPS最优(带生成效果+指标对比)——项目学习记录
  • Java接口性能优化面试问题集锦:高频考点与深度解析
  • 【设计模式】访问者模式
  • 微软庆祝它成立整整50周年
  • 将图片按照指定大小批量进行裁剪(可设置步长_python)
  • 怎样使用Python编写的Telegram聊天机器人
  • Android compose源码浅析——Modifier
  • Python第八章03:Pyecharts快速入门
  • excel中的VBA指令示例(一)