问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

电脑提示:stack oberflow at line:0 怎么办?

发布网友 发布时间:2024-10-01 15:44

我来回答

2个回答

热心网友 时间:2024-11-10 22:04

0行栈溢出

顾名思义,stack overflow 就是是栈溢出了。在进行数值运算时,我们常常要和运算结果的溢出打交道。数值运算结果可能上溢(overflow),也可能是下溢(underflow)。不过栈的溢出显然只可能是上溢,即栈空间被用完了。在提起“栈”(stack)这个概念的时候,千万不要忘记了它的兄弟“堆”(heap),也要切记不要把二者搞混了。
那么,什么时候会把给用完了呢?如果我们记得C程序中的局部变量是在栈中分配的,函数调用会占用一部分栈空间,则可以很容易地构造出相应的测试用例。

1、定义占用空间过大的局部变量所导致的栈溢出

C:\> more stack_local.c

/*
* Allocate too much memory from stack will cause stack overflow.
*/

#include <stdio.h>

int main(int argc, char *argv[])
{
int foo[1000000];
return 0;
}

C:\> cl stack_local.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

stack_local.c
Microsoft (R) Incremental Linker Version 8.00.50727.42
Copyright (C) Microsoft Corporation. All rights reserved.

/out:stack_local.exe
stack_local.obj

C:\> stack_local

此时出现一个异常对话框:stack-local.jpg 。

2、函数递归调用导致的栈溢出

C:\> more stack_recursive.c

/*
* Infinite recursive calls will lead to stack overflow soon.
*/

#include <stdio.h>

static void foo(void);
static void bar(void);

int main(int argc, char *argv[])
{
foo();
return 0;
}

static void foo(void)
{
bar();
}

static void bar(void)
{
foo();
}

C:\> cl stack_recursive.c
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.42 for 80x86
Copyright (C) Microsoft Corporation. All rights reserved.

stack_recursive.c
Microsoft (R) Incremental Linker Version 8.00.50727.42
Copyright (C) Microsoft Corporation. All rights reserved.

/out:stack_recursive.exe
stack_recursive.obj

C:\> stack_recursive

该程序没声没息就结束了。查看进程返回值能发现它其实是异常终止了。只不过没有像 stack_local 那样弹出一个对话框。

C:\> echo %errorlevel%
-1073741819

要搞清楚这两个程序为什么有这点细微的区别,可以查阅一下二者的汇编代码。原来是 _chkstk() 在起作用,其中 stack_local 在程序初始加载时就会导致 _chkstk() 失败,触发异常。而 stack_recursive 可以正确加载,并运行一段时间,然后导致栈溢出,并触发异常。

要正确处理栈溢出采用以下办法:
(1)修正我们的程序,不要造成无穷递归或太深的递归。我们可以把某些递归代码非递归化,例如那个经典的 qsort ,最好就用非递归的算法来实现,就比较皮实一点。
(2)修正我们的程序,不要定义过大的局部变量,特别是在定义大结构、大数组时要格外小心。有时我们可能会用 _alloca() 这样的特殊函数直接在栈上分配空间,更要多加注意。
(3)利用编译器的特性,将进程允许的栈大小设置得大一些。例如可以采用 MSC 中的 /STACK 参数开关。
(4)对于那些还可能导致栈溢出的代码,采用 Microsoft 的结构化异常处理或标准的 C++ 异常处理机制,结合 _resetstkoflw() 进行处理。当然了,要是不嫌麻烦,我们也可以自己探测所用栈的大小,动态地检测是否可能导致栈溢出,以避免可能的异常。

热心网友 时间:2024-11-10 22:00

原因是乱装软件导致的注册表紊乱。
解决方法如下:
“开始”——“运行”——输入“cmd”进入命令行
输入“regsvr32 c:\windows\system32\pngfilt.dll”一般即可解决问题。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
苹果电脑电池充不进电苹果电脑充不进去电是怎么回事 苹果电脑不充电没反应苹果电脑充电指示灯不亮充不了电怎么办 狗狗更加忠诚护家、善解人意,养一只宠物陪伴自己,泰迪能长多大... 描写泰迪狗的外形和特点的句子 国外留学有用吗 花钱出国留学有用吗 !这叫什么号 百万医疗赔付后是否可以续保 前一年理赔过医疗险还能续保吗? 医疗住院险理赔后还能购买吗? 神船到底怎么样。为什么很多人黑啊,战神系列价格真诱人,有懂得吗_百 ... 土对缺水的人好不不好 志高水龙头热水器不加热怎么回事 孩子一六年一月一生的 土命缺水 求名字 志高热水水龙头不出热水 志高热水器热水不热 志高热水器怎么不烧热水 志高热水器显示故障不出热水怎么办 志高热水器怎么不出热水 苹果手机不想更新系统怎么关提示 苹果手机不想更新系统如何关提示_百 ... 纯棉的衣服穿时间长了起毛了怎么办 ...坐在最后一排的最后一个座位,是19排26号.这个电影院能容纳500_百度... 衬衫上面为什么有毛毛 推荐6⃣️部全高能电影,慎入不要独自观看 漂亮又简单的灯笼做法 怎么做漂亮又简单的灯笼? 兄弟,陌生人,家人,认识,朋友,同班男,同班女,小学,同村的qq分组名 特殊工种十二年可否提前退休? QQ里男同学分组叫什么 宜宾市市企工作16年工龄,工资2100元,今年退休有多少退休金 宜宾市灵活就业缴费基数100%.20年后能领取多少钱 LOL赏金猎人大招笑声、、 谢谢啊、 求英雄联盟赏金猎人开大招的笑声和枪声 音效 Word中修改所有字母和数字的格式的操作方法 ...中的数字和字母改变格式我如何将word中数字和字母修改格式 微信拔卡后还能用吗? 燃油添加剂在什么时候添加? 宝宝先天性心脏病的七大症状 儿童先天心脏病的表现 燃油宝这么好为什么中石化不直接加到汽油里? 先天性心脏病的早期表现 燃油添加剂问题? 先天性心脏病的表现 先天性心脏病有什么症状 燃油添加剂为什么要没油的时候加 先天性心脏病的表现有哪些 儿童先天性心脏病的症状 先天性心脏病的常见症状 请问我这到底是鸡眼还是脚气?请看图,谢谢 泡过脚后,脚上出现鸡眼装物体,平时不太看出来,到底是鸡眼还是脚气... 大家看看我的这个是不是鸡眼啊? 十一月放假一号什么节日 为什么女儿出嫁爸爸会哭呢?