| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2237 人关注过本帖
标题:堆栈溢出的一个问题
只看楼主 加入收藏
zgx_921
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-9-4
收藏
 问题点数:0 回复次数:14 
堆栈溢出的一个问题

我在网上看到的,我以为答案是4,因为只有4才在栈里面,不过有人说答案是1,不知道为什么

下面使用那项可能会引起堆栈溢出

1.静态全局变量
2.动态全局变量
3.静态局部变量
4.动态局部变量

搜索更多相关主题的帖子: 堆栈 
2007-09-11 10:21
zgx_921
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-9-4
收藏
得分:0 

知道的不屑说


2007-09-11 16:17
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 
3.静态局部变量
2007-09-11 16:21
zgx_921
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-9-4
收藏
得分:0 

给个原因撒!我觉得肯定不止我一个人不知道。3不是在静态存储区么


2007-09-11 18:06
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 
你不是说堆栈溢出吗,当然只有在堆栈中分配空间的变量才会使堆栈溢出了。

局部的auto变量就是在堆栈中分配空间的。我刚写了一个堆栈溢出的程序给你看看:

#include <stdio.h>
#include <stdlib.h>
int StackOverflow();
void show();

int i;
int main(int argc, char *argv[])
{
StackOverflow(10);
system(\"PAUSE\");
return 0;
}

int StackOverflow(int count)
{
void (*array[3])();

for(i=0;i<count;i++)
array[i]=show;

return 0;
}


void show()
{
printf(\"your stack is overflow! haha~\n\");
system(\"PAUSE\");
}


2007-09-11 18:45
zgx_921
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-9-4
收藏
得分:0 

非常感谢,的确溢出了,不过有些原理还不是很懂,为什么在i=6的时候count才改变,为什么在i=57的时候才进入show(),你的那句array[i]=show我真的不是很懂,不好意思。

我查了内存,在array[2]跟count之间有8个字节 ,这是什么?
下面是我画的StackOverflow函数的内存图
+-+-+-+-+-+-+-+-+
| count | ---------->参数
+-+-+-+-+-+-+-+-+
| 4F 10 40 00 |
+-+-+-+-+-+-+-+-+
| 80 FF 12 00 |
+-+-+-+-+-+-+-+-+ \
| array[2] | |
+-+-+-+-+-+-+-+-+ |
| array[1] | >-------->动态变量
+-+-+-+-+-+-+-+-+ |
| array[0] | |
+-+-+-+-+-+-+-+-+ /


2007-09-12 12:48
百年不亮
Rank: 3Rank: 3
等 级:新手上路
威 望:8
帖 子:789
专家分:0
注 册:2006-4-14
收藏
得分:0 
我上面的程序有问题,重新改了下:

#include <stdio.h>
#include <stdlib.h>
#define COUNT 10

int StackOverflow();
void show();

int i;
int main(int argc, char *argv[])
{
StackOverflow();
system(\"PAUSE\");
return 0;
}

int StackOverflow()
{
void (*array[3])();

for(i=0;i<COUNT;i++)
array[i]=show;

return 0;
}


void show()
{
printf(\"your stack is overflow! haha~\n\");
system(\"PAUSE\");
}


你改这一句:#define COUNT 10来找溢出地址。我是通过用show()的入口地址覆盖StackOverflow()的返回地址的,最后程序不能正常返回,我在linux中运行时先调用了几次show()之后是提示了个“段错误”,windows中是不停的调用show()。
2007-09-12 13:12
雨中飞燕
Rank: 3Rank: 3
等 级:禁止访问
威 望:8
帖 子:2200
专家分:0
注 册:2007-8-9
收藏
得分:0 
楼上研究这个很强



by 雨中飞燕 QQ:78803110 QQ讨论群:5305909

[url=http://bbs.bc-cn.net/viewthread.php?tid=163571]请大家不要用TC来学习C语言,点击此处查看原因[/url]
[url=http://bbs.bc-cn.net/viewthread.php?tid=162918]C++编写的Windows界面游戏[/url]
[url=http://yzfy.org/]C/C++算法习题(OnlineJudge):[/url] http://yzfy.org/
2007-09-12 13:22
zgx_921
Rank: 1
等 级:新手上路
帖 子:30
专家分:0
注 册:2007-9-4
收藏
得分:0 
的确很强,我先消化下~~~~~Thanks!

2007-09-12 14:04
hackerkill
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2007-9-12
收藏
得分:0 

研究研究呵呵....
本人是个编程爱好者,本人自己有个黑客技术论坛(振华培训基地),这里有c、C++、JAVA、VB等编程语言的教程,学习程序从理论到上机,最后课本学完后有项目实战是根据北大清鸟的课程体系来设计的(本人是北大清鸟的学员),
初学者的困惑都是共同的,很多程序能看懂就是不会编,能看懂```说明你的相应语法知识学到位了`````而且也一定的理解思维能力``不能编```说明你缺少练习``要多思考``多练习``任何一个问题``再难``都有它简单的一面``都是从这些简单的面慢慢升级的```当你不会编的时候``不问题简单化``简单到你会编了``然后再一步步的``难度化``最后到它的原来难度```,本人知道编程是个枯燥无味的活,也许多人参研究、讨论就会轻松多了,这也是本人建站的初衷呵呵。。。爱好编程的朋友可以去我的论坛逛逛,共同学习,挑战困难呵呵。
论坛网址:http://www.zh-hack.com/bbs/index.php


振华培训基地论坛:http://www.
2007-09-12 15:17
快速回复:堆栈溢出的一个问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.037488 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved