麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

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

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

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


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 日韩精品久久久久久久九岛 | 免费h片网站| 久久精品亚洲欧美日韩精品中文字幕 | 免费看污视频在线观看 | 亚洲少妇诱惑 | 免费观看一区 | 9797色| 亚洲一级电影在线观看 | 激情久久免费视频 | 在线播放免费人成毛片乱码 | 欧美一级黄色录相 | 免费观看黄色影片 | 国产乱弄| 国产一级一级 | 久久草草影视免费网 | 国产毛毛片一区二区三区四区 | 在线亚洲欧美 | 国产精品hd免费观看 | 澳门一级淫片免费视频 | 国产午夜精品一区二区三区嫩草 | 九九热视频这里只有精品 | 国产91在线播放九色 | 国产伦乱视频 | 国产午夜免费福利 | 在线看一区二区三区 | 精品久久久久久久久久中文字幕 | 久色免费视频 | 久久久久久久99 | 欧美日韩免费在线观看视频 | 天天干天天碰 | 国产在线观看91一区二区三区 | 成人精品视频在线 | 爽爽视频免费看 | 毛片成人 | 久久99精品国产 | 一级黄色片武则天 | 青草久久av | 精品久久久久久久久久久久久 | xxxxhd73国产 | 亚洲av一级毛片特黄大片 | 亚洲导航深夜福利涩涩屋 |