当前位置: 首页 > 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段比数据段更节省磁盘空间,因为它不需要存储实际的初始值,仅需记录需要多少空间来存放这些变量即可。

相关文章:

  • 【虚拟机栈中的栈帧是什么?有什么作用?局部变量表、操作数栈、动态链接和方法返回地址是什么?有什么作用?为什么要放在栈帧里?】
  • 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)
  • IT周末做网站违反制度么/一个关键词要刷多久
  • 电商网站建设报价单/软文推广经典案例
  • 深圳有做网站最近价格/免费的网站申请
  • 宜昌 网站建设 公司/优化步骤
  • 网站上的网站地图怎么做/制作网页的步骤
  • 移动端原型/网络seo优化公司