国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 編程設計 > 正文

揭開匯編死循環的神秘面紗

2020-07-14 13:42:20
字體:
來源:轉載
供稿:網友
首先請大家看這么一個簡單的小程序:

#include <stdio.h>

void main()
{
int i, b[10];
for ( i = 0; i <= 10; i++ )
{
b[i] = 0;
}
}


請問這個程序是否有錯?A.正常 B.越界 C.死循環

正確答案是C,相信選A或選B的朋友一定會很納悶。事實上我也是如此,單單從程序的表面上看,按定義這應該是個越界,因為當循環進行到i == 10的時候,程序將試圖將b[10]賦值為0,而C語言中,b[10]的聲明就是指定b[0]~b[9]可用。

然而程序的結果你看到了,這是個死循環無疑。

也好,那么讓匯編來告訴你——以及我——這一切的真相吧,在這之前請你把i和b[10]的定義改成:

int i = 0, b[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };


然后,將這個程序反匯編,可以得到:
 
讓我來解釋一下這段匯編代碼的含義吧。在系統的實現中,i和數組b[10]是分配在棧上的變量,在內存中的分布如下圖:
 
現在你看到了,i所占據的正是b[10]的位置,而b[10] = 0;這一句會被這樣運行:

*(&b[0] + 10) = 0;


所以這一句的結果,就是把0賦值給i。這樣一來在第11次循環的時候,i將會被重新置為0,那么循環結束的條件也就永遠不會滿足了,循環也就是個死循環了。

事實上單單討論C語言的內部實現并沒有什么意義,而且這樣書寫的循環在程序設計中也絕對不能夠出現。所以我所想要討論的,就是如何讓匯編幫助我們解決表面上無法看清楚的東西,僅此而已。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 满城县| 龙胜| 闽侯县| 夏邑县| 彰武县| 临湘市| 延边| 湖口县| 加查县| 马公市| 临湘市| 高尔夫| 青川县| 玉树县| 荣昌县| 康平县| 德化县| 长葛市| 河池市| 昂仁县| 阿合奇县| 五原县| 同仁县| 界首市| 吉木萨尔县| 兴安盟| 益阳市| 美姑县| 尉犁县| 沁阳市| 饶平县| 珠海市| 西峡县| 濮阳市| 宁陵县| 邯郸县| 清苑县| 九江市| 酒泉市| 高要市| 长岭县|