C++ stack overflow 局部数组变量定义超过所分配的最大空间

【C语言的栈溢出问题以及部分解决】 本文也提到尾递归优化,怎么扩大栈空间大小,VS优化选项修改的方法,以及解决“/O1”和“/RTC1”命令行选项不兼容问题。缓冲区溢出(Buffer overflow);内存溢出(memory overflow);数据溢出(data overflow)。本文只谈及缓冲区溢出的——栈溢出,即五种原因的介绍:①函数递归层次太深。②局部变量体积太大。③动态申请空间使用之后没有释放。④数组访问越界。⑤指针非法访问。... 阅读详情

局部数组变量定义所分配的最大空间为多少?如何设置大小

有两个程序
A:

  1. #include "stdafx.h"
  2. int _tmain(int argc, _TCHAR* argv[])
  3. {
  4. int nArray[256000] = {0};
  5. nArray[1] = 5;
  6. printf("array 1 is %d",nArray[1]);
  7. return 0;
  8. }

B:

  1. #include "stdafx.h"
  2. int _tmain(int argc, _TCHAR* argv[])
  3. {
  4. int nArray[260000] = {0};
  5. nArray[1] = 5;
  6. printf("array 1 is %d",nArray[1]);
  7. return 0;
  8. }

大家通过运行可以发现,A是可以正常运行的,B虽然编译通过了,可是当运行时就会弹出错误

错误的原因,就是栈溢出
局部变量的申请空间是存放于栈中,windows里默认栈内存是1M

所以当申请空间大于1M时就会出现溢出错误

通过debug就会进入以下文件chkask.asm

page ,132
title chkstk – C stack checking routine
;***
;chkstk.asm – C stack checking routine
;
; Copyright (c) Microsoft Corporation. All rights reserved.
;
;Purpose:
; Provides support for automatic stack checking in C procedures
; when stack checking is enabled.
;
;*******************************************************************************
.xlist
include cruntime.inc
.list
; size of a page of memory
_PAGESIZE_ equ 1000h

CODESEG
page
;***
;_chkstk – check stack upon procedure entry
;
;Purpose:
; Provide stack checking on procedure entry. Method is to simply probe
; each page of memory required for the stack in descending order. This
; causes the necessary pages of memory to be allocated via the guard
; page scheme, if possible. In the event of failure, the OS raises the
; _XCPT_UNABLE_TO_GROW_STACK exception.
;
; NOTE: Currently, the (EAX < _PAGESIZE_) code path falls through
; to the "lastpage" label of the (EAX >= _PAGESIZE_) code path. This
; is small; a minor speed optimization would be to special case
; this up top. This would avoid the painful save/restore of
; ecx and would shorten the code path by 4-6 instructions.
;
;Entry:
; EAX = size of local frame
;
;Exit:
; ESP = new stackframe, if successful
;
;Uses:
; EAX
;
;Exceptions:
; _XCPT_GUARD_PAGE_VIOLATION – May be raised on a page probe. NEVER TRAP
; THIS!!!! It is used by the OS to grow the
; stack on demand.
; _XCPT_UNABLE_TO_GROW_STACK – The stack cannot be grown. More precisely,
; the attempt by the OS memory manager to
; allocate another guard page in response
; to a _XCPT_GUARD_PAGE_VIOLATION has
; failed.
;
;*******************************************************************************
public _alloca_probe
_chkstk proc
_alloca_probe = _chkstk
push ecx
; Calculate new TOS.
lea ecx, [esp] + 8 – 4 ; TOS before entering function + size for ret value
sub ecx, eax ; new TOS
; Handle allocation size that results in wraparound.
; Wraparound will result in StackOverflow exception.
sbb eax, eax ; 0 if CF==0, ~0 if CF==1
not eax ; ~0 if TOS did not wrapped around, 0 otherwise
and ecx, eax ; set to 0 if wraparound
mov eax, esp ; current TOS
and eax, not ( _PAGESIZE_ – 1) ; Round down to current page boundary
cs10:
cmp ecx, eax ; Is new TOS
jb short cs20 ; in probed page?
mov eax, ecx ; yes.
pop ecx
xchg esp, eax ; update esp
mov eax, dword ptr [eax] ; get return address
mov dword ptr [esp], eax ; and put it at new TOS
ret
; Find next lower page and probe
cs20:
sub eax, _PAGESIZE_ ; decrease by PAGESIZE
test dword ptr [eax],eax ; probe page.
jmp short cs10
_chkstk endp
end

提示栈溢出

所以解决此问题的方法就是扩大栈空间的大小

方法为

项目->属性->链接器->系统->堆栈保留大小

注:这里填的是字节数
如果你想把他扩大为2M的话,
1024*1024*2 = 2097152

然后再编译运行的话A,B就都可以通过了


Apple 网页 SRP 登录系列文章(四):Hashcash 工作量证明与完整登录流程 本文是Apple SRP登录系列文章的收官之作,重点解析了Apple独有的Hashcash工作量证明机制并展示了完整的登录流程实现。文章详细介绍了Hashcash的安全目的、格式标准、计算核心算法及难度评估方法,特别提供了Python实现代码。同时还讲解了如何动态获取服务器Hashcash参数以及建立容错机制。最后呈现了完整的Apple SRP登录主函数架构,为开发者提供了从理论到实践的全面指导。全文通过代码示例和流程分析,系统性地阐述了Apple安全登录机制的技术细节。 阅读详情

相关推荐

一篇关于轴承故障诊断的综述

在设备的故障检测中,有约30%-40%的设备故障是由轴承故障引起的,因此本文将列举有关检测轴承故障使用到的相关数据集,模型和算法。 数据集 现有的数据集,普遍由固定在电机马达上的两个震动检测器获得,并根据需要,分离震动数据在时域和频域上的特征以供网络模型学习。 不同的数据集,区别在于,检测的马达转速不同,环境不同,取样频率不同,一段样本的时长不同等等 (1)Case Western Reserve University (CWRU) Dataset 该数据集拥有多种数据,测量的时候,通过改变轴承.

weixin_42036144的博客 2万+

test dword ptr [eax],eax ; probe page. 是怎么回事?

【问题描述】 编译时没有错误,但是调试或者运行时程序就报错了!一脸懵逼~~ debug调试提示: xxx.exe 中的 0x00e731d7 处未处理的异常: 0xC00000FD: Stack overflow 原来是栈溢出了! 【问题为何会出现】 局部变量的申请空间是存放于栈中,windows里默认栈内存是1M,所以当申请空间大于1M时就会出现溢出错误。 【解决方案...

HelloKandy's Blog 6214

Python邮件自动化实战:基于imaplib和email库的高效邮件管理方案

本文详细介绍了如何使用Python的imaplib和email库实现高效邮件自动化管理。通过实战案例展示自动收取、解析邮件、下载附件等核心功能,帮助开发者快速构建企业级邮件处理系统,大幅提升工作效率。特别适合需要处理大量邮件的金融、数据分析等场景。

weixin_30500105的博客 618

test dword ptr [eax],eax ; probe page.

POJ2593的题目与POJ2479一毛一样,只不过串可以有100000这么大。于是我在做的时候,就沿用了上个blog的方法,在callMax函数中申明局部变量left[100000]和right[100000],另外,在main函数中也申明了局部变量a[100000],然后就大事不好了。编译时不报错,但是运行时总是报出现中断异常。然后我就调试,发现在申明int left[100000];的这一句

蚂蚁取经 610

【Docker】完美解决拉取镜像超时报错:ERROR: Get https://registry-1.docker.io/v2/

因为我们下载的镜像是外网的镜像资源,所以下载的速度会非常的慢,甚至大概率下载时会报错,所以需要我们配置一个国内的服务器镜像地址,国内服务器镜像地址有很多,这里咱们就说一下阿里镜像加速器的配置方法。

liu_chen_yang的博客 12万+

堆栈溢出问题 test dword ptr [eax],eax probe page.

今天写了一个程序,运行出现:ALG002.exe 中的 0x010e43a7 处有未经处理的异常: 0xC00000FD: Stack overflow 程序调试出现:test    dword ptr [eax],eax     ; probe page. 经过调试发现是由于栈溢出,因为程序中出现了局部数组变量,局部变量是存储在栈中的,数组过大导致栈溢出,window中默认栈大小为1M。对此

FutureFlyme的博客 1343

IPCP(IP Control Protocol,IP控制协议)

IPCP(IP Control Protocol,IP控制协议)

天赐好车的博客 754

test dword ptr [eax],eax ; probe page. 分页出错

Windows系统默认分页大小为1M 1024 *1024,当申请的空间大于1M时就会出现如下问题: 1.在Debug下调试程序,出现如下错误:test dword ptr [eax],eax ; probe page. Stack overflow 2.通过debug就会进入以下文件chkask.asm page ,132 title chkstk – C stack ch...

android菜鸟的专栏 531

一文读懂5G网络整体架构(接入网+承载网+核心网)

接入网重构分级(分工更细、效率更高)、承载网三段化升级(管道更宽、更智能)、核心网服务化云化(管理更灵活、成本更低)最终实现“成本最优、资源灵活、场景适配”,才能支撑自动驾驶、工业互联网、智慧城市、VR/AR等各种新场景,真正走进我们的生活。

鲸落寰宇 428

Openlayers 教程 02 - 地图添加 WKT WKB GeoJson 格式的点线面数据

WebGIS 开发中,对于数据量不是很大的场景,可以直接从数据库读取数据,通过创建点线面要素(Feature),然后添加到矢量图层(vectorLayer)中,在地图上展示。添加点线面的方法可以封装一下,方便使用。...

非科班Java出身GISer的博客 3854

Effective C++笔记之二十四:stack overflow

溢出(Stack Overflow)是指程序运行过程中,栈空间被耗尽,导致无法继续分配栈内存的错误。C++程序中,栈用于存储函数调用的局部变量、返回地址、函数参数等。当栈空间耗尽时,会引发栈溢出,通常导致程序崩溃。如果用的是Visual Studio,报错弹窗如下图所示。如果用的是其他IDE,比如所Qt Creator,直接crash了,无任何提示。通常的现象就是调用了一个函数,然后就崩了,注释调这个函数,一切正常。

草上爬的博客 2770

lammps多晶正弦粗糙界面建模

其中,30可以理解为正弦曲线的幅度,150为正弦曲线的基准坐标值,80控制周期,改变参数多试试就能找到规律。很久之前介绍过lammps粗糙界面建模,主要是在lammps中进行一维和二维的正弦粗糙面建模。运行完成后,会生成final.data,这个模型即为上表面为正弦波动的粗糙界面。新建1.py文件,粘贴下面内容后,运行:python 1.py。多晶需要在atomsk中进行,因此上述的方法就不再适用。最近有学员咨询多晶模型的正弦粗糙界面建模应该如何实现。在cmd窗口按顺序运行以下命令创建多晶模型。

lammps_jiayou的博客 387

如何解决C/C++中stack overflow问题

一般遇到这个问题,有两个常见的情况,一个是存在函数的递归调用,另一个是函数中定义了一个较大的数组或者别的变量。  1、在函数的递归调用中,函数中定义的局部变量所占的空间要直到递归结束才能被释放,这样函数不停的递归,堆栈早晚会被用完,解决这一问题的办法是在递归函数中每次动态的分配变量的内存,在使用结束的时候释放内存。遇到这种情况更改堆栈的最大空间大小是没有用的,要从代码的优化入手。下面以二维数组的动...

坚持 2万+

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

ssm框架搭建

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

如何解决C、C++中stack overflow问题

转自:http://wenku.baidu.com/link?url=qQJbEF8-tiu-ijhjkn-SMv71Yv9zyYqvo67xVz570nPZsgpzmFupIticPO0hhAuB_JQKsbymsl57uMO7J44vzaJXgMgOLN_T4Gqr1oNMkFq 如何解决C/C++中stack overflow问题  一般遇到这个问题,有两个常见的情况,一个是存在

u011909633的专栏 4160

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

C++开发调试:精通飞栈(Stack Overflow)问题的定位与预防

飞栈,即Stack Overflow,是程序在执行过程中调用栈超出其分配空间的现象。飞栈通常由无限递归、过深的递归、异常堆栈处理不当或局部变量过大引起。飞栈问题虽然棘手,但通过理解其原因、掌握定位方法,并采取适当的预防策略,可以显著降低其发生的概率。现代C++提供的新特性和工具,为我们提供了更多的解决方案。

bigchen 1642

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

【C++】数组定义引发Stack overflow错误(运行时是报段错误)

C++(实际是C的语法)定义数组时出错,触发Stack overflow错误(可执行文件运行时,是报段错误)。这是由于函数内申请的变量,数组,是在栈(stack)中申请的一段连续的空间。栈的默认大小为2M或1M,开的比较小(但全局变量,全局数组,静态数组(static)则是开在全局区(静态区)(static)。大小为2G,所以能够开的很大)。所以静态分配的空间不能太大。遇到要申请大的空间时,就需要动态申请或使用不连续内存。可以使用malloc、new申请空间,或者使用array或vect

豆芽菜 701

堆栈大小不够导致的stack overflow问题分析

堆栈大小不够问题分析引出问题分析解决方案 引出问题 最近同事提供了一个dll库给我使用,写好测试代码,编译通过,运行时报出栈溢出错误 分析 既然vs提示stack overflow(栈溢出),那应该就是接口实现代码中的局部变量大小超过了vs编译器默认的堆栈空间大小。 由于是前人(已离职人员)写的代码,同事亦称未改动此处接口代码… 那好吧( ̄へ ̄),拿过源码…look…look 主要查看接口代码中定义的局部变量(如数组变量、结构体变量等)。。。。。。(¬_¬)瞄 由于代码中结构体定义较为复杂,那咱就先

lt4959的专栏 1581

Stack overflow 编译能通过,运行时出现Stack overflow

Stack overflow 编译能通过,运行时出现Stack overflow 大家都知道,Windows程序的内存机制大概是这样的,全局变量(局部的静态变量本质也属于此范围)存储于堆内存,该段内存较大,一般不会溢出; 函数地址、函数参数、局部变量等信息存储于栈内存,VC6中栈内存默认大小为1M,对于当前日益扩大的程序规模而言,稍有不慎就可能...

weixin_33868027的博客 419

堆栈溢出(Stack Overflow)的解决方法

堆栈溢出是程序调试中,比较麻烦的一种错误,但不外乎就是递归和变量申请大空间内存;错误时,弹出如下图所示框框:其中,0x7c934ffd的值依具体情况而不同。OxC00000FD是错误标号; 1. 局部数组变量空间太大,如下: int main(int argc, char* argv[]){    char stack_overflow[1024*1024*5];   

PlayBoy's 部落格 3万+

stack overflow的 问题

在做cpu和GPU运行(同样的程序)时间对比时,增大数组长度时,会出现stack overflow的问题,然后百度找到了解决办法,包括vc和VS,总体来说,就是改变堆栈保留的大小,如下图所示 下面是参考文献: http://www.cnblogs.com/xlw1219/archive/2013/03/15/2961352.html 在解释原因前我们先看一下一个由C/C+

ZIV555的博客 1272

C/C++中stack overflow问题

int a[1000][1000]; 最近在进行C++编程时,遇到的栈溢出问题。 对于每个函数系统会分配1M的内存给函数栈,但是当你创建了较大的数组时,会发生溢出问题。尽量不要采用改变堆栈的最大空间大小的方案,治标不治本。 解决方法有两种: 1、用new方法,new方法本身会使用其他,不会占用栈内存。附带一下用new创建二维数组的方法。 int *x = new[x][y] 是一个编

rockmandarkzero的专栏 1660

分配空间不足引起的错误:‘Stack smashing detected’

使用环境:ubuntu 11.10、C++ 出错情景: 使用mysql执行一个query语句,以进行一个涉及多个表的联合查询(query语句比较长) 代码如下: [cpp] view plain copy char query[128]={0};   sprintf(query, ".....");   ...  

梦想专栏 1万+

C++数组内存分配:栈、堆与静态区的限制与最佳实践

在C++编程中,内存管理是核心概念之一,理解不同内存区域的分配原理对编写高效、稳定的程序至关重要。程序运行时内存主要分为栈、堆和静态/全局存储区,每个区域的管理机制和容量限制各不相同。栈空间用于存放局部变量和函数调用信息,其大小有限(通常1-8MB),适合存放小型、短生命周期的数据;堆空间通过动态分配提供大容量存储,受系统虚拟内存限制,适合处理大数据集;静态存储区存放全局和静态变量,在程序启动时分配。掌握这些原理的技术价值在于能够根据数据规模和生命周期选择合适的内存区域,避免栈溢出和内存分配失败。在实际应用

weixin_34239592的博客 392
上一篇: WOSA/XFS及SP综述
下一篇: 一步一步开发文件搜索 (一)
Garyhou
博客等级 码龄20年 41粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值