部分原创

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:

  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};

    //66 大于 1m了

  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就都可以通过了

源文档 <http://hi.baidu.com/linzch/blog/item/e5107ff0a6cf6ccf7831aa02.html>

转载于:https://www.cnblogs.com/titer1/archive/2012/03/31/2427422.html

有关堆栈溢出(in vs 2005)的读书笔记--堆栈中 申请大数组相关推荐

  1. Think in Java第四版 读书笔记10 第16章 数组

    Think in Java第四版 读书笔记10 第16章 数组 数组和容器很像 但他们有一些差别 16.1 数组为什么特殊 数组与容器的区别主要在效率和存储类型 效率:数组是简单的线性序列 使得数组的 ...

  2. 分析堆栈溢出原因_我分析了有关堆栈溢出的所有书籍。 这是最受欢迎的。

    分析堆栈溢出原因 by Vlad Wetzel 通过弗拉德·韦泽尔 我分析了有关堆栈溢出的所有书籍. 这是最受欢迎的. (I analyzed every book ever mentioned on ...

  3. 《流畅的Python第二版》读书笔记——函数中的类型注解

    引言 这是<流畅的Python第二版>抢先版的读书笔记.Python版本暂时用的是python3.10.为了使开发更简单.快捷,本文使用了JupyterLab. 本章关注于Python在函 ...

  4. 哈佛幸福课相关积极心理学经典英文原版书籍-读书笔记(连载中)(转)

    原文地址:http://www.wisdomsnack.com/1291.html 2000年, 美国心理学家Martin Seligman 和 Mihaly Csikszentmihalyi 发起了 ...

  5. c++堆栈溢出怎么解决_c语言进阶:堆栈原理揭秘

    学习C语言时,初学者常常被教材上一股脑抛出来的诸如"字符串","指针","链表"等概念搞得晕头转向,再加上教材重概念,轻运用的叙述方式,这些 ...

  6. php堆栈溢出,php - 警告:php_eval() - 堆栈内存溢出

    我在我的drupal网站中添加了一些php代码. 当我尝试运行它时,它会显示警告 "警告:请与支持人员联系有关php_eval()(/ folderpath ../ modules / ph ...

  7. java现有一个泛型类 提供数组排序功能,java编程思想读书笔记 第十六章 数组

    数组,你可以创建并组装它们,通过使用整型索引值访问它们的元素,并且它们的尺寸不能改变. 1.数组为什么特殊 数组与其他种类的容器之间的区别有三方面:效率.类型和保存基本类型的能力.在Java中数组是一 ...

  8. JQuery读书笔记--JQuery-Form中的AjaxForm和AjaxSubmit的区别

    JQuery中的AjaxForm和AjaxSubmit使用差不多功能也差不多.很容易误解. 按照作者的解释: AjaxForm ajaxForm不能提交表单.在document的ready函数中,使用 ...

  9. [读书笔记]C#中get与set的用法

    get是读取属性时进行的操作,set是设置属性时进行的操作.定义一个属性如果只有get,这个属性就是只读的.同样,只有set,属性就是只写的,当然只写的属性是没有任务意义的. 假设类是一个银行,既能存 ...

最新文章

  1. electron——初探
  2. 在博文顶部添加文章字数及阅读时间信息:阅读本文需要xx分钟
  3. 深入思考:算法工程师的落地能力具体指什么,如何提升自己的落地能力?
  4. MFC+GDI+绘制出雷达余晖效果
  5. pointer-events(禁止鼠标事件)
  6. app营销实训报告_第七届全国金融与证券投资模拟实训大赛圆满落幕!
  7. softmax分类(多项逻辑回归)的Pyhon实现及其与SVM的比较
  8. 《Unity着色器和屏幕特效开发秘笈》—— 1.7 创建渐变纹理来控制漫反射着色...
  9. core部署iis的 调试net_ASP.NET Core环境变量和启动设置的配置教程
  10. java实现grpc
  11. Tushare的安装及使用介绍
  12. 小区广播机制(MIB、SIB)
  13. 0804Python总结-单继承,多继承,菱形继承,__init__魔术方法(构造方法)
  14. 虚拟 DOM 是什么 有什么优缺点
  15. Python 数据分析微专业课程--项目实战11 中国城市资本流动问题探索
  16. 面试官:说说微信小程序的支付流程?
  17. IPsec中IKE与ISAKMP过程分析(快速模式-消息2)
  18. tp5:为什么find()出来的数据有时候可以用toArray() 有时候会报错?
  19. 2.2吴恩达深度学习笔记之优化算法
  20. Texstudio 英文拼写检查功能出问题的解决方法

热门文章

  1. dpkg ihr状态_考勤机数据无法同步
  2. 网络技巧:无线路由器越用越慢的解决方法
  3. 网络知识:交换机中的半双工与全双工知识笔记
  4. IntelliJ IDEA 常用快捷键和设置
  5. 传统的线性降维方法效果不佳。_机器学习西瓜书简明笔记(11)降维与度量学习...
  6. 16位调色板和32位调色板_使调色板可访问
  7. 若川知乎问答:做前端感觉很吃力怎么办?
  8. 博世豪掷10亿欧元德国建半导体工厂,要掌握自动驾驶芯片化核心竞争力?
  9. 开源 java CMS - FreeCMS2.6 Web页面信息采集
  10. yum安装openoffice