當前位置:首頁 » 編程語言 » c語言stackoverflow
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言stackoverflow

發布時間: 2022-09-12 00:50:59

❶ 用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函數再次分配內存,就不會出現了,畢竟自己的東西沒限制