这段代码有什么问题?任何人都可以解释一下吗?
#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循环中发生了什么?
答案 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]);
由于你还将其标记为作业,我建议你也看看你的循环终止条件。