我的任务是编写一个程序来处理一个简单的1D数组来返回它的元素值,但编译器的表现却很奇怪;输出比我有数组元素更多的值。它也不完全符合我的一个语句(一个每8个元素打印一个新行字符)并且没有为我的变量赋值。我认为,一旦第一个问题得到解决,其他两个问题就会消失。
以下是我的简报:
设计,编码和测试以下程序:
这是我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(){
srand(time(NULL));
int marks[20];
int i = 0;
int sum = 0;
int min;
int max;
for(i;i<=sizeof(marks);i ++){
marks[i] = rand() % 100;
sum += marks[i];
if(i % 8 == 0){
printf("\n");
}
printf("%d ", marks[i]);
if(marks[i]>max){
max = marks[i];
}
else if(marks[i]<min){
min = marks[i];
}
}
printf("\n\nThe minimum value is: %d", min);
printf("\nThe maximum value is: %d", max);
printf("\n\nThe average value is: %d", sum / sizeof(marks));
return 0;
}
有人可以帮助我获得正确的输出吗?
答案 0 :(得分:1)
sizeof()函数返回数组的字节长度,因此这段代码“认为”你的数组是20 *你机器上的字节大小int
。您只想在循环中使用i < 20
或转到
for (i;i<sizeof(marks)/sizeof(int); i ++) { ...
请注意,您可能不希望<=
循环中的for
运算符,因为数组是0索引的,因此marks[20]
实际上是数组之外的一个。
答案 1 :(得分:1)
我可以看到有两个问题会在您的代码中调用undefined behavior。
for(i;i<=sizeof(marks);i ++)
,你就出界了。int min; int max;
未初始化,您正在尝试使用它。解决这个问题。
for
循环条件更改为for(i; i< 20; i++)
。最好使用像#define SIZ 20
这样的预处理器结构,然后在代码中使用它,使其保持一致和健壮。max
应为INT_MIN
,min
可为INT_MAX
。 (请参阅limits.h
以供参考)。为了澄清第2点的更多内容,max
和min
是自动局部变量,如果未明确初始化,则包含不确定的值。
C11
,章节§6.7.9,
如果没有显式初始化具有自动存储持续时间的对象,则其值为 不确定的。
然后,直接来自Aneex J,§J.2,Undefined behavior,
使用具有自动存储持续时间的对象的值 不确定的。
答案 2 :(得分:0)
if(marks[i]>max){
max = marks[i];
}
else if(marks[i]<min){
min = marks[i];
}
min
和max
未在此处初始化。确保在最高级别设置编译器警告,以便在忘记初始化变量时收到警告消息。
for(i;i<=sizeof(marks);i ++){
这没有意义。将sizeof(marks)
替换为您要循环的次数,并使用<
代替<=
。
例如:
const int num_marks = 20; // or use #define
int marks[num_marks];
for(i = 0; i < num_marks; i++) {}