我的C程序输出不需要的数组值

时间:2016-01-07 16:36:58

标签: c arrays loops

我的任务是编写一个程序来处理一个简单的1D数组来返回它的元素值,但编译器的表现却很奇怪;输出比我有数组元素更多的值。它也不完全符合我的一个语句(一个每8个元素打印一个新行字符)并且没有为我的变量赋值。我认为,一旦第一个问题得到解决,其他两个问题就会消失。

以下是我的简报:

设计,编码和测试以下程序:

  1. 使用0到100之间的随机数填充20个元素数组(标记)。
  2. 将数字8打印到一行
  3. 打印出数字的最大数字,最小数字和平均值
  4. 这是我的代码:

    #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;
    }
    

    有人可以帮助我获得正确的输出吗?

3 个答案:

答案 0 :(得分:1)

sizeof()函数返回数组的字节长度,因此这段代码“认为”你的数组是20 *你机器上的字节大小int。您只想在循环中使用i < 20或转到

for (i;i<sizeof(marks)/sizeof(int); i ++) { ...

请注意,您可能不希望<=循环中的for运算符,因为数组是0索引的,因此marks[20]实际上是数组之外的一个。

答案 1 :(得分:1)

我可以看到有两个问题会在您的代码中调用undefined behavior

  1. for(i;i<=sizeof(marks);i ++),你就出界了。
  2. int min; int max;未初始化,您正在尝试使用它。
  3. 解决这个问题。

    1. for循环条件更改为for(i; i< 20; i++)。最好使用像#define SIZ 20这样的预处理器结构,然后在代码中使用它,使其保持一致和健壮。
    2. 初始化您的局部变量。 max应为INT_MINmin可为INT_MAX。 (请参阅limits.h以供参考)。
    3. 为了澄清第2点的更多内容,maxmin是自动局部变量,如果未明确初始化,则包含不确定的值。

      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];
}

minmax未在此处初始化。确保在最高级别设置编译器警告,以便在忘记初始化变量时收到警告消息。

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++) {}