<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    一江春水向東流

    做一個有思想的人,期待與每一位熱愛思考的人交流,您的關注是對我最大的支持。

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      44 隨筆 :: 139 文章 :: 81 評論 :: 0 Trackbacks
    看似簡單的一段程序如下:
    ?int main()
    {
    ?? int i,j[8];
    ?? for(i=0;i<=8;i++)
    ??? j[i]=0;
    ?? return 0;
    }?
    ??? gcc編譯運行會陷入死循環.??
    ?
    ??? 因為變量 i 和數組 j[8]是保存在棧中,默認是由高地址向低地址方向存儲. 輸出變量地址可以發現: i 存儲位置在0xbfd90dec, j[0]、j[1]...j[7]在內存的地址分別是0xbfdab05c、0xbfdab060,...0xbfdab078. 如下所示:
    ???????? ?高地址 <--------------------------------------->低地址
    ???????????????????? ?? ? ?i,j[7],j[6],j[5],j[4],j[3],j[2],j[1],j[0]
    ?
    ??? 如果在int i,j[8]后面再定義變量int c,那么c就存放在j[0]的往低方向的下一個地址0xbfdab058 .

    ????? 現在不難理解這段程序為什么會出現死循環了。j[8]的位置就是變量i所在的位置。這樣當i=8時的j[i]=0語句,實際上就是將i的值置為0,然后 i 又從0到8循環一直下去.? 如果將原句改為int j[8],i; 就不會出現死循環,而僅僅是一個段越界錯誤.

    另一個程序:
    #include <stdio.h>
    int main()
    {
    ??????? int i;
    ??????? char c;
    ??????? for(i=0;i<5;i++)
    ??????? {
    ??????????????? scanf("%d",&c);
    ??????????????? printf("i=%d ",i);
    ??????? }
    ??????? printf("\n");
    }
    編譯后運行
    [foxman@local~]#./a.out
    0??? (輸入0)
    i=0? (輸出 i 值)
    1
    i=0
    2
    i=0
    3
    i=0
    4
    i=0
    ...
    這樣一直循環下去。

    問題在于,c被聲明為char類型,而不是int類型。當程序要求scanf讀入一個整數時,應該傳遞給它一個指向整數的指針。而程序中scanf得到的卻是一個指向字符的指針,scanf函數并不能分辨這種情況,只能將這個指向字符的指針作為指向整數的指針而接受,并且在指針指向的位置存儲一個整數。因為整數所占的存儲空間要大于字符所占的存儲空間,所以c附近的內存會被覆蓋.

    由上面分析,i 和 c 是由高地址到低地址存儲在棧中,這樣在c所在位置嘗試存儲一個4字節變量,會占用比c高的3個字節(覆蓋掉 i 字節的低3位),即使 i 總是為零,一直循環下去.

    如果每次輸入Ctrl+D作為字符終止符不存儲int到c處,那么就會輸出正常i=0..4了.

    posted on 2007-12-25 18:18 allic 閱讀(540) 評論(0)  編輯  收藏 所屬分類: C/C++
    主站蜘蛛池模板: youjizz亚洲| 亚洲免费电影网站| 黄色毛片免费在线观看| 国产婷婷高清在线观看免费| 亚洲一区二区三区丝袜| 欧美日韩国产免费一区二区三区| 亚洲成人福利在线观看| 很黄很黄的网站免费的| 亚洲一卡2卡3卡4卡国产网站 | 2019亚洲午夜无码天堂| 国拍在线精品视频免费观看| 国产成+人+综合+亚洲专| 午夜精品在线免费观看| 国产大陆亚洲精品国产| 久久久久亚洲AV成人网人人网站 | 久久九九全国免费| 亚洲最大福利视频网站| 波多野结衣中文一区二区免费| 精品久久久久亚洲| 在线观看亚洲精品福利片| 精品视频一区二区三区免费| 久久久婷婷五月亚洲97号色| 亚洲成人免费网站| 国产亚洲欧美日韩亚洲中文色| 亚洲 自拍 另类小说综合图区| 99久久成人国产精品免费| 久久精品国产亚洲AV大全| 精品久久久久成人码免费动漫| 亚洲乱色伦图片区小说| 久久久久亚洲爆乳少妇无 | 亚欧色视频在线观看免费| 亚洲人片在线观看天堂无码| 亚洲AV网站在线观看| 99蜜桃在线观看免费视频网站| 国产精品亚洲午夜一区二区三区 | 久久国产精品免费观看| 亚洲av片不卡无码久久| 亚洲色偷偷狠狠综合网| 日韩精品人妻系列无码专区免费| 亚洲欧洲日产国码久在线| 久久久久亚洲精品无码网址|