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

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

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

2020-06-27 15:48:14
字體:
來源:轉載
供稿:網友
首先請大家看這么一個簡單的小程序:

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



發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 布尔津县| 晋宁县| 五峰| 麻江县| 濮阳县| 澎湖县| 青铜峡市| 蕉岭县| 定陶县| 鄂托克前旗| 慈溪市| 湛江市| 晋江市| 广汉市| 黑龙江省| 永登县| 如皋市| 屯留县| 扶沟县| 宁陕县| 宝坻区| 乡宁县| 阿勒泰市| 萨迦县| 蓬莱市| 江西省| 留坝县| 黄平县| 东海县| 荆州市| 吉木萨尔县| 宁南县| 沂源县| 柘荣县| 南昌县| 中超| 汉源县| 盐亭县| 抚宁县| 常德市| 青浦区|