c代码输出意外/预期的行为

时间:2011-11-27 17:57:28

标签: 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循环中发生了什么?

2 个答案:

答案 0 :(得分:5)

sizeof运算符返回size_t类型的值,这是无符号值。在for循环条件测试中:

d <= (TOTAL_ELEMENTS-2)

您正在将签名的值(d)与无符号值(TOTAL_ELEMENTS-2)进行比较。这通常是一个警告条件,您应该调高编译器的警告级别,以便正确收到警告消息。

编译器只能为有符号或无符号比较生成代码,在这种情况下,比较是无符号的。 d中的整数值转换为无符号值,在2的补码架构上最终为0xFFFFFFFF或类似值。这不低于您的TOTAL_ELEMENTS-2值,因此比较为假。

答案 1 :(得分:-1)

你通过设置d = -1开始循环,它应该是d = 0.所以对于第一个元素你正在读取随机的内存位。

如果您解决了这个问题,那么您可以将printf更改为

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

由于你还将其标记为作业,我建议你也看看你的循环终止条件。