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

首頁 > 應用 > 軟件技巧 > 正文

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

2024-07-16 17:44:54
字體:
來源:轉載
供稿:網友
首先請大家看這么一個簡單的小程序:

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 应用必备| 孝义市| 虹口区| 黄龙县| 万盛区| 隆子县| 乌拉特前旗| 建水县| 承德市| 阜宁县| 饶阳县| 武夷山市| 穆棱市| 宝丰县| 土默特左旗| 许昌市| 赤壁市| 石嘴山市| 天长市| 南阳市| 塔河县| 台湾省| 海城市| 开原市| 海兴县| 康定县| 那坡县| 轮台县| 微山县| 霍城县| 南漳县| 辽宁省| 河源市| 祁连县| 彰武县| 宁化县| 清徐县| 祁东县| 甘肃省| 灵宝市| 武山县|