有关堆栈溢出(in vs 2005)的读书笔记--堆栈中 申请大数组
部分原创
66下一步 |
Vs 堆栈 理论修改的上限是多少 ? 问题2: 全局变量去 最大的上限是多少? 堆栈(休养版本测试) 2012年3月31日17:31:27 3月 |
从 10^5到 10^6数组,导致vs…
当前:搭好脚手架。
改进: 修改vs系数。(byte 为单位i)
改进二: 细化 时间粒度。
以上是我在项目汇总的修改。下面是阅读笔记
test dword ptr [eax],eax ; probe page.
2010年05月18日 星期二 20:19
局部数组变量定义超过所分配的最大空间
-----------------------------------
Posts Tagged 变量
局部数组变量定义所分配的最大空间为多少?如何设置大小
有两个程序
A:
- #include "stdafx.h"
- int _tmain(int argc, _TCHAR* argv[])
- {
- int nArray[256000] = {0};
- nArray[1] = 5;
- printf("array 1 is %d",nArray[1]);
- return 0;
- }
B:
- #include "stdafx.h"
- int _tmain(int argc, _TCHAR* argv[])
- {
int nArray[260000] = {0};
//66 大于 1m了
- nArray[1] = 5;
- printf("array 1 is %d",nArray[1]);
- return 0;
- }
大家通过运行可以发现,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就都可以通过了
源文档 <http://hi.baidu.com/linzch/blog/item/e5107ff0a6cf6ccf7831aa02.html>
转载于:https://www.cnblogs.com/titer1/archive/2012/03/31/2427422.html
有关堆栈溢出(in vs 2005)的读书笔记--堆栈中 申请大数组相关推荐
- Think in Java第四版 读书笔记10 第16章 数组
Think in Java第四版 读书笔记10 第16章 数组 数组和容器很像 但他们有一些差别 16.1 数组为什么特殊 数组与容器的区别主要在效率和存储类型 效率:数组是简单的线性序列 使得数组的 ...
- 分析堆栈溢出原因_我分析了有关堆栈溢出的所有书籍。 这是最受欢迎的。
分析堆栈溢出原因 by Vlad Wetzel 通过弗拉德·韦泽尔 我分析了有关堆栈溢出的所有书籍. 这是最受欢迎的. (I analyzed every book ever mentioned on ...
- 《流畅的Python第二版》读书笔记——函数中的类型注解
引言 这是<流畅的Python第二版>抢先版的读书笔记.Python版本暂时用的是python3.10.为了使开发更简单.快捷,本文使用了JupyterLab. 本章关注于Python在函 ...
- 哈佛幸福课相关积极心理学经典英文原版书籍-读书笔记(连载中)(转)
原文地址:http://www.wisdomsnack.com/1291.html 2000年, 美国心理学家Martin Seligman 和 Mihaly Csikszentmihalyi 发起了 ...
- c++堆栈溢出怎么解决_c语言进阶:堆栈原理揭秘
学习C语言时,初学者常常被教材上一股脑抛出来的诸如"字符串","指针","链表"等概念搞得晕头转向,再加上教材重概念,轻运用的叙述方式,这些 ...
- php堆栈溢出,php - 警告:php_eval() - 堆栈内存溢出
我在我的drupal网站中添加了一些php代码. 当我尝试运行它时,它会显示警告 "警告:请与支持人员联系有关php_eval()(/ folderpath ../ modules / ph ...
- java现有一个泛型类 提供数组排序功能,java编程思想读书笔记 第十六章 数组
数组,你可以创建并组装它们,通过使用整型索引值访问它们的元素,并且它们的尺寸不能改变. 1.数组为什么特殊 数组与其他种类的容器之间的区别有三方面:效率.类型和保存基本类型的能力.在Java中数组是一 ...
- JQuery读书笔记--JQuery-Form中的AjaxForm和AjaxSubmit的区别
JQuery中的AjaxForm和AjaxSubmit使用差不多功能也差不多.很容易误解. 按照作者的解释: AjaxForm ajaxForm不能提交表单.在document的ready函数中,使用 ...
- [读书笔记]C#中get与set的用法
get是读取属性时进行的操作,set是设置属性时进行的操作.定义一个属性如果只有get,这个属性就是只读的.同样,只有set,属性就是只写的,当然只写的属性是没有任务意义的. 假设类是一个银行,既能存 ...
最新文章
- electron——初探
- 在博文顶部添加文章字数及阅读时间信息:阅读本文需要xx分钟
- 深入思考:算法工程师的落地能力具体指什么,如何提升自己的落地能力?
- MFC+GDI+绘制出雷达余晖效果
- pointer-events(禁止鼠标事件)
- app营销实训报告_第七届全国金融与证券投资模拟实训大赛圆满落幕!
- softmax分类(多项逻辑回归)的Pyhon实现及其与SVM的比较
- 《Unity着色器和屏幕特效开发秘笈》—— 1.7 创建渐变纹理来控制漫反射着色...
- core部署iis的 调试net_ASP.NET Core环境变量和启动设置的配置教程
- java实现grpc
- Tushare的安装及使用介绍
- 小区广播机制(MIB、SIB)
- 0804Python总结-单继承,多继承,菱形继承,__init__魔术方法(构造方法)
- 虚拟 DOM 是什么 有什么优缺点
- Python 数据分析微专业课程--项目实战11 中国城市资本流动问题探索
- 面试官:说说微信小程序的支付流程?
- IPsec中IKE与ISAKMP过程分析(快速模式-消息2)
- tp5:为什么find()出来的数据有时候可以用toArray() 有时候会报错?
- 2.2吴恩达深度学习笔记之优化算法
- Texstudio 英文拼写检查功能出问题的解决方法
热门文章
- dpkg ihr状态_考勤机数据无法同步
- 网络技巧:无线路由器越用越慢的解决方法
- 网络知识:交换机中的半双工与全双工知识笔记
- IntelliJ IDEA 常用快捷键和设置
- 传统的线性降维方法效果不佳。_机器学习西瓜书简明笔记(11)降维与度量学习...
- 16位调色板和32位调色板_使调色板可访问
- 若川知乎问答:做前端感觉很吃力怎么办?
- 博世豪掷10亿欧元德国建半导体工厂,要掌握自动驾驶芯片化核心竞争力?
- 开源 java CMS - FreeCMS2.6 Web页面信息采集
- yum安装openoffice