❶ 用microsoft visual studio 2008执行c语言出现栈溢出怎么解决
if(n==1)
move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
} hanoi(n-1,two,one,three);
应该是这样的
if(n==1)
move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
大括号位置打错了,呵呵,要用心检查哦!
❷ C语言调用函数时,什么情况会出现栈溢出,栈溢出会出现什么结果
是不是调用函数的形参过多?一般来说,函数的参数都存在栈中,当然也可以申请堆。如果形参过多就会发生栈溢出,用递归的时候发生较多。栈溢出会发生段错误,也就是可能会占用系统的栈(好像不能访问)。。。
错了给我说……
❸ C语言!!!!
一楼正确。
第二道题的A
如果操作的数是常量比如1,就不能用++,--对其进行操作了。
如果定义了一些不能变的数也就不能用了。
❹ (STACK_OVERFLOW)是什么意思
http://stackoverflow.com/
stack overflow (堆栈溢出)
栈溢出(又称缓冲区溢出)攻击是最常用的黑客技术之一。我们知道,UNIX本身以及其上的许多应用程序都是用C语言编写的,C语言不检查缓冲区的边界。在某些情况下,如果用户输入的数据长度超过应用程序给定的缓冲区,就会覆盖其他数据区。这称作“堆栈溢出或缓冲溢出”。
一般情况下,覆盖其他数据区的数据是没有意义的,最多造成应用程序错误。但是,如果输入的数据是经过“黑客”精心设计的,覆盖堆栈的数据恰恰是黑客的入侵程序代码,黑客就获取了程序的控制权。如果该程序恰好是以root运行的,黑客就获得了root权限,然后他就可以编译黑客程序、留下入侵后门等,实施进一步地攻击。按照这种原理进行的黑客入侵就叫做“堆栈溢出攻击”。
为了便于理解,我们不妨打个比方。缓冲区溢出好比是将十磅的糖放进一个只能装五磅的容器里。一旦该容器放满了,余下的部分就溢出在柜台和地板上,弄得一团糟。由于计算机程序的编写者写了一些编码,但是这些编码没有对目的区域或缓冲区——五磅的容器——做适当的检查,看它们是否够大,能否完全装入新的内容——十磅的糖,结果可能造成缓冲区溢出的产生。如果打算被放进新地方的数据不适合,溢得到处都是,该数据也会制造很多麻烦。但是,如果缓冲区仅仅溢出,这只是一个问题。到此时为止,它还没有破坏性。当糖溢出时,柜台被盖住。可以把糖擦掉或用吸尘器吸走,还柜台本来面貌。与之相对的是,当缓冲区溢出时,过剩的信息覆盖的是计算机内存中以前的内容。除非这些被覆盖的内容被保存或能够恢复,否则就会永远丢失。
在丢失的信息里有能够被程序调用的子程序的列表信息,直到缓冲区溢出发生。另外,给那些子程序的信息——参数——也丢失了。这意味着程序不能得到足够的信息从子程序返回,以完成它的任务。就像一个人步行穿过沙漠。如果他依赖于他的足迹走回头路,当沙暴来袭抹去了这些痕迹时,他将迷失在沙漠中。这个问题比程序仅仅迷失方向严重多了。入侵者用精心编写的入侵代码(一种恶意程序)使缓冲区溢出,然后告诉程序依据预设的方法处理缓冲区,并且执行。此时的程序已经完全被入侵者操纵了。
入侵者经常改编现有的应用程序运行不同的程序。例如,一个入侵者能启动一个新的程序,发送秘密文件(支票本记录,口令文件,或财产清单)给入侵者的电子邮件。这就好像不仅仅是沙暴吹了脚印,而且后来者也会踩出新的脚印,将我们的迷路者领向不同的地方,他自己一无所知的地方。
缓冲区溢出的处理
你屋子里的门和窗户越少,入侵者进入的方式就越少……
由于缓冲区溢出是一个编程问题,所以只能通过修复被破坏的程序的代码而解决问题。如果你没有源代码,从上面“堆栈溢出攻击”的原理可以看出,要防止此类攻击,我们可以:
1、开放程序时仔细检查溢出情况,不允许数据溢出缓冲区。由于编程和编程语言的原因,这非常困难,而且不适合大量已经在使用的程序;
2、使用检查堆栈溢出的编译器或者在程序中加入某些记号,以便程序运行时确认禁止黑客有意造成的溢出。问题是无法针对已有程序,对新程序来讲,需要修改编译器;
3、经常检查你的操作系统和应用程序提供商的站点,一旦发现他们提供的补丁程序,就马上下载并且应用在系统上,这是最好的方法。但是系统管理员总要比攻击者慢一步,如果这个有问题的软件是可选的,甚至是临时的,把它从你的系统中删除。举另外一个例子,你屋子里的门和窗户越少,入侵者进入的方式就越少。
黑客主要先从微软漏洞公布表上或者0days上找到漏洞,再根据漏洞编写溢出程序(好多都自带扫描功能)包括本地提权溢出,远程提权溢出.编好后,先用那个扫描一下有漏洞的主机,然后再用它溢出获得权限,控制目标主机.
❺ 汉诺塔 stack C语言 编译通过 执行总是输出overflow 请求高手帮忙指点改正 程序如下
把你的程序加了打印,一个死循环,每次推入栈的东西都是一样的,n-1,1,n-1,不可能退出的,你的基本思路是什么,这个程序实在找不出你这个循环的用处。
input a = 4
in push f=A , to=B ,sub=C , num =4
in pop num =4
in push f=A , to=B ,sub=C , num =3
in push f=A , to=C ,sub=B , num =1
in push f=B , to=C ,sub=A , num =3
in pop num =3
in push f=A , to=B ,sub=C , num =3
in push f=A , to=C ,sub=B , num =1
in push f=B , to=C ,sub=A , num =3
in pop num =3
in push f=A , to=B ,sub=C , num =3
in push f=A , to=C ,sub=B , num =1
in push f=B , to=C ,sub=A , num =3
in pop num =3
。。。。。。
给你个可以显示每一步的,用的是递归,应该是一般的方法,用循环的我还没有试过,找bug太费劲了,你还是自己每一步打印一下看看是哪里出问题了可能是哪里导致死循环吧。这个东西每一步移动到哪个柱子是不一定的,你在while里面规定了三步的移动方向可能会有问题吧。这种短小的程序出问题基本上都是死循环或数组越界导致的,不过越界一般是segment falut。你最好先用4个盘子的试试,打印出每一步执行的结果,只要4个的能完成其他的都可以完成了。
// cz 汉诺塔小游戏
#include <stdio.h>
#define MAX 9
int a[MAX],b[MAX],c[MAX];
int *d[3];
void showtower(void)
{
int i;
static int j=0;
printf("tower now %d:",j++);
printf("\na:");
for(i=0;i<MAX;i++){
if(d[0][i]==0)
printf("--");
else
printf("%2d",d[0][i]);
}
printf("\nb:");
for(i=0;i<MAX;i++){
if(d[1][i]==0)
printf("--");
else
printf("%2d",d[1][i]);
}
printf("\nc:");
for(i=0;i<MAX;i++){
if(d[2][i]==0)
printf("--");
else
printf("%2d",d[2][i]);
}
printf("\n");
i=200000000;
while(i--);
}
// 找个空柱子,其实只有一个柱子可以移
int findempty(int n,int t, int o)
{
int i,j;
for(j=0;j<3;j++){
if(j!=t&&j!=o){
// 如没bug这里不需判断的,因为除了t和o只有一个地方可以去。
if(n==1) return j;
for(i=MAX-1;i>0;i--){
if(((n-1)>d[j][i]))
return j;
}
}
}
}
// 将最大的盘移到目标柱子
void movelast(int n,int t, int o)
{
int i;
for(i=MAX-1;i>=0;i--){
if(d[o][i]==n){
d[o][i]=0;
break;
}
}
for(i=MAX-1;i>=0;i--){
if(d[t][i]<n){
d[t][i]=n;
break;
}
}
}
// 汉诺主程序。
// n : 碟子总数
// t : 目标杆子,012为abc
// o : 当前所在杆子
void hanno(int n,int t,int o)
{
int i,j;
if(0==n) return;
// 先找一个空杆把上面部分移走
j = findempty(n,t,o);
if(j>2){printf("\nerror, no empty pillar !!!\n");exit(0);}
hanno(n-1,j,o);
// 再把最下面的移到t
movelast(n, t, o);
showtower();
// 再把上面部分移回来
hanno(n-1,t,j);
}
int main(int argv,char* argc[])
{
int i,n;
d[0]=&a[0];
d[1]=&b[0];
d[2]=&c[0];
for(;i<MAX;i++){
a[i] = 0; b[i] = 0; c[i] = 0;
}
if (argv!=2) {
printf("input num error\n");
return 0;
}
n=atoi(argc[1]);
if(n>MAX-1){
printf("num can't big than %d\n",MAX-1);
return 0;
}
for(i=0;i<n;i++)
a[MAX-1-i]=n-i;
showtower();
printf("\n\nstart moving\n");
hanno(n,2,0);
printf("\nGame Over\n");
return 0;
}
❻ 请教个C语言stack overflow问题
unsigned uniform_int_s_e(unsigned start, unsigned end)
{
unsigned base = rand();
unsigned range = end - start;
unsigned remainder = RAND_MAX % range;
unsigned bucket = RAND_MAX / range;
if (base < RAND_MAX - remainder)
return start + base / bucket;
else
return uniform_int_s_e(start, end);
}
/*RAND_MAX是0x7fff(十进制:32767),这个当end=40000时,
unsigned range = end - start; => range=end
unsigned remainder = RAND_MAX % range; => remainder=RAND_MAX(因为range>RAND_MAX)
unsigned bucket = RAND_MAX / range; => bucket=0
然后就有两个问题:
1、if (base < RAND_MAX - remainder) 这句话base是个unsigned,是不会小于0的,导致无限递归了
2、return start + base / bucket;这bucket是0应该不能作为除数吧
*/
❼ C++ stack overflow
从堆上申请内存空间,比如C语言使用malloc()申请
C++也可以使用 int *p = new int[2097152*21];这样来申请内存空间
但是从堆上分配的要自己释放
malloc()和free()
new 和 delete 配合使用
申请内存之后,要检查指针看是否申请成功
❽ C语言读取大量文件进行计算栈溢出怎么解决
使用堆空间,所有指针、内存都从堆上分配,只要你主机内存够,就不会溢出!
❾ 计算机C语言编程 0 error 0warning.但就是(STACK_OVERFLOW)
lz你的注释都看不到啊...这个程序大概做什么的...
❿ 在c语言中,当处理大量数据时,常有stack overflow 或者runtime error等问题,请问怎样解决啊
使用库函数的stack时应该有上限的,你可以尝试自己写一个stack,预先设定一个初始化最大值,每当存满的时候用realloc函数再次分配内存,就不会出现了,毕竟自己的东西没限制