小程式輸出—暗藏殺機的數組越界訪問

來源:互聯網
上載者:User

請看下面這個小程式---殺機重重呀

#include<stdio.h>#define MAX 255int main(){unsigned char a[MAX] ,i;for(i=0;i<=MAX;i++)a[i]=i;for(i=0;i<=MAX;i++)printf("%d ",a[i]);printf("\n");return 0;}

看著貌似沒問題,再仔細一看,發現數組越界。可是再仔細看看就不是那麼回事了。。。

當i = 255的時候,可以執行a[255]=255;因為數組不會檢查數組元素的訪問是否越界,然後就i++,那麼i成了多少呢?請注意,這個是無符號的。i+1就會變成11111111+1=100000000.最高位捨去,那麼i=0;於是就成了死迴圈了。所以編譯沒問題,運行卻有問題。

再看一個類似的例子

#include<stdio.h>int main(){char k = 0;while(k>=0)k++;printf("%d\n",k);return 0;}

答案是-128,具體的跟上面的那個差不多,k轉換為ASCII碼值以後,k++,一直運行到11111111,然後加1,電腦計算加法是計算的補碼,所以100000000高位去掉,是00000000,然後補碼,11111111,然後這個就是-128.與上面那個不同的是,這個不是無符號的,所以有負數。

我發現,不知道底層啟動並執行機制,編程永遠不算精通呀。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.