2011-11-27 50 views
1

這段代碼有什麼問題?誰能解釋一下?c代碼輸出意外/預期行爲

#include <stdio.h> 
#include <malloc.h> 

#define TOTAL_ELEMENTS (sizeof(array)/sizeof(array[0])) 
    int array[] = {23,34,12,17,204,99,16}; 

    int main() 
    { 
     int num; 
     int d; 
     int size = TOTAL_ELEMENTS -2; 
     printf("%d\n",(TOTAL_ELEMENTS-2)); 

     for(d=-1;d <= (TOTAL_ELEMENTS-2);d++) 
      printf("%d\n",array[d+1]); 

     return 0; 
    } 

當我打印它給5,但裏面for循環發生了什麼?

回答

5

sizeof運算符返回值size_t,這是一個無符號值。在你for循環條件測試:

d <= (TOTAL_ELEMENTS-2) 

你是比較有無符號值(TOTAL_ELEMENTS-2)一簽署值(d)。這通常是一個警告條件,您應該調高編譯器的警告級別,以便您能夠正確收到警告消息。

編譯器只能生成有符號或無符號比較的代碼,在這種情況下比較是無符號的。 d中的整數值被轉換爲無符號值,在2的補碼架構上最終爲0xFFFFFFFF或類似值。這不會低於您的TOTAL_ELEMENTS-2值,因此比較是錯誤的。

+0

完美的解釋... :-) – peeyush

+0

2s補碼是無效的 - '(size_t)-1'總是'SIZE_MAX'。 – caf

-1

通過設置d = -1開始循環,它應該是d = 0。因此,對於第一個元素,您正在讀取隨機存儲器位。

如果解決這個問題,那麼你就可以改變你的printf是

printf("%d\n",array[d]); 

正如你也標誌着這個功課,我建議也看看你的循環終止條件。

+0

爲什麼我被低估? – DaV

+2

但數組[d + 1]被打印出來,所以出了什麼問題?這不是讀取隨機位,因爲循環立即終止 – peeyush

+0

我沒有,但看到上面的格雷格 – peeyush