c語言,下面的程式結果為啥是,c語言,下面的程式結果為啥是

2021-09-11 19:11:07 字數 2195 閱讀 5316

1樓:

恭喜你,你發現了一個非常重要的系統漏洞形式。有很多對系統的破解都是基於此原理,下面我此進行一下解釋。

首先先大概指明錯誤: char buf[4]; 是分配了4個位元組的儲存空間, strcpy(buf, "aaaa"); 是向buf寫入5個位元組的資料,因為別忘了字串最後總隱藏著一個字串結束符'\0',也就是說,strcpy向buf寫入的資料超過了它自身的大小,於是資料寫入過程就出現了越界,這樣就會造成其它變數的資料被破壞(當然也可能是系統資料被破壞)。在這個例子裡,對buf的越界寫入後,恰好破壞了i的值,因此最後i的值變成了0。

這段程式需要正確執行,需要這樣定義: char buf[5];   //buf必須是5個位元組或者超過5個位元組。

好了,下面再詳細解釋一下整個過程:

(1) 首先,需要指出,區域性變數的記憶體分配是在棧中分配的,而棧的分配是從記憶體的高地址向低地址分配。

記憶體地址      變數        值

0x1000        buf[0]

0x1001        buf[1]

0x1002        buf[2]

0x1003        buf[4]

0x1004        i(低8位)     0x01

0x1005        i(高8位)     0x00

(3) 執行strcpy函式後:

記憶體地址      變數        值

0x1000        buf[0]      'a'

0x1001        buf[1]      'a'

0x1002        buf[2]      'a'

0x1003        buf[4]      'a'

0x1004        i(低8位)    0x00  (因為"aaaa"最後還要寫一個字串結束符'0')

0x1005        i(高8位)    0x00

看到沒,最後那個字串結束符正好把變數i低8位的內容給破壞了。因此最後輸出i的值是0。

這個錯誤就是典型的「緩衝區溢位漏洞」。你知道蘋果手機為什麼能越獄麼?很多時候就是利用了類似這樣的處理漏洞!

2樓:醉俊傑

你的buf大小隻有4,而「aaaa」是五個位元組,也就是說存在記憶體錯誤,看起來,多出的那個'\0'存到了i裡;

改正很簡單,buf[5]再試試。

c語言 下面程式執行結果為什麼是0 而不是1 main() {int n[5]={0,0,0},

3樓:與子如初見

因為迴圈的時候當i等於k的時候退出迴圈了,根本沒有執行迴圈體n[i] = n[i]+1;這一句,所以n[k]的值為初始化的值,初始化的值為0.故輸出0,。

4樓:匿名使用者

因為當i=k時,for迴圈的條件已經不滿足,不會執行n[i]=n[i]+1。故n[k]還是0.

5樓:殷明明孫楓

選cn=4;

相當於是這樣

intn=0;

while(n++<=2)

//先進行

n<=2判斷,再進行n++自增運算。n=3的時候,n>2,但還是會進行++自增運算,所以為回4

printf("%d",n);

請幫忙解釋一下下面的程式為什麼結果輸出是0,0,關於c語言的

6樓:匿名使用者

看你的**排版看到頭暈。p[1].m->n 的m為第三個元素,n未初始化,全域性變數預設為0。,p[2].m->n的m為第一個元素,n在迴圈中被賦值為0。

眼睛有點痛

c語言階乘問題,程式每次執行結果都是0,為什麼呢

7樓:

因為你的i從0開始的,任何數乘以0你說得多少。你把i的初值給1試試。

#include

int main()

8樓:實小林志堅

i的初始值不能為0,在階乘中,最小要為1。

9樓:匿名使用者

#include

int main()

10樓:阿也費哇鷹潭法

將for(i=0;i<=n;i++)

改為for(i=1;i<=n;i++)

c語言,下面程式執行的結果是什麼

最後輸出 1711717 過程 進入fun後s1指向字元 1 回s2指向答字元 7 t 1 s1指向 2 w 1234567 w 1734567 s2指向 6 w 1734517 t 7,s1指向 3 w 1734517 w 1714517 s2指向 5 w 1714717 t 1 s1指向 4 w...

C語言下面程式執行結果為什麼是0而不是1 mainint n

因為迴圈的時候當i等於k的時候退出迴圈了,根本沒有執行迴圈體n i n i 1 這一句,所以n k 的值為初始化的值,初始化的值為0.故輸出0,因為當i k時,for迴圈的條件已經不滿足,不會執行n i n i 1。故n k 還是0.選cn 4 相當於是這樣 intn 0 while n 2 先進行...

剛開始學C語言,下面這個程式的輸出結果是什麼

下面這個程式的輸出結果是22222。這個程式首先定義了一個巨集,使n的值為20。然後程式從main函式進入,定義了整型變數i和整型陣列a,a中含有20個元素,但只輸入了10個元素,因此其餘10個由系統自動填充。接著呼叫fun函式,呼叫的fun函式是將a 1 的值賦給a 3 a 10 此後陣列a中有1...