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

時間 2021-09-11 22:33:35

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語言下列程式執行結果int a 7,b

岔路程式緣 下列程式的執行結果是 d include int a 7,b 3 void fun int x,int y main a.4,7 b.7,3 c.2,6 d.8,6 答案選d,原因是 1 首先程式開頭定義的a 7,b 3屬於全域性變數。它在所有函式中有效。2 其次在main函式中又定義了...

二級C語言,下列程式的輸出結果是

迴圈條件應該是 p 0 吧 字串存的形式是 a b a b c d c d 0 所以迴圈條件就是判斷字串是否到頭了,然後if判斷p指向的字元ascii碼是否在a和z之間,由於大寫字母的ascii碼小於小寫字母,如果是小寫字母就記錄到字元陣列a中,當迴圈完成後在a最好乙個記錄的字元後加字串結束符 0 ...

c語言,以下程式的輸出結果是,C語言問題 以下程式的輸出結果是?

輸出1 3 這是遞迴了,所以先是fun 3 進入後發現3 2 1,所以又繼續func 3 2 也就是fun 1 進入發現1 2 0,就執行prinft,輸出1,然後fun 1 就返回了 返回出去正好是fun 3 的prinft,輸出3 進入fun 3 進入fun 1 輸出1退出fun 1 輸出3退出...