2011-11-27 46 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