繁体   English   中英

函数返回内存地址

[英]Function returning memory address

我正在尝试编写一个程序,该程序将读取数组的值的数量,调用一个函数以输入所述值,然后计算平均值。 从那里它将调用另一个函数以打印出相应的消息。 问题在于它似乎返回的是内存地址。

提前致谢!

这是我的代码:

#include <stdio.h>
#include <math.h>

int compute_grade_avg(int grades[], int size)
{

  int i, result, average, sum=0;

  //Ask the user for the specific grades                                                                                           
  for(i=0;i<size;i++){
    printf("Enter a grade:\n");
    scanf("%d", &grades[i]);
  }

  //Calculate the sum of values in the array                                                                                       
  for(i=0;i<size;i++){
    sum += grades[i];
  }

  //Calculate the average based off of the sum and size of the array                                                               
  average = sum/size;
  result = ceil(average);

  return result;
}
//Function to print the corresponding message                                                                                      
int write_grade_message()

{
  int average;

  //Messages to print depending on grade                                                                                           
  if (average < 60){
    printf("Failed semester - registration suspended");
  }
  else if(average < 69){
    printf("On probation for next semester");
  }
  else if(average < 79){
    printf("");
  }
  else if(average < 89){
    printf("Dean's list for the semester");
  }
  else if(average < 100){
    printf("Highest honors for the semester");
  }
  return(0);
}
//Main Function                                                                                                                    
int main()
{
  int size, average;

  //Enter the number of grades that will go into the array                                                                        \

  printf("Enter the number of grades to be entered:\n");
  scanf("%d", &size);

  int grades[size];


  //Call compute grade average function                                                                                            
  average = compute_grade_avg(grades, size);

  //Call write grade message function                                                                                              
  write_grade_message(average);

  return(0);
}

问题特别是,您将参数传递给int write_grade_message() ,该参数采用未指定数量的参数,这使代码可以编译,但现在具有未定义的行为

还有另一种发生未定义行为的原因,因为您在write_grade_message()重新声明了average并且试图在未事先初始化的情况下读取该值1 您需要更改write_grade_message()才能读取

void write_grade_message(int average) ...

并删除内部average声明,您的代码可能会正常工作,还请阅读问题的注释以获取更多有用的提示。

如果您的代码干净地编译并且没有发出任何警告或消息,那么您需要启用编译器的警告和诊断,这不仅可以帮助您了解有时可能会犯的一些愚蠢的错误,而且还可以帮助您深入学习该语言,因为您可以从警告消息中推断出一些有关该语言的有用知识。


1 在C语言中,未明确初始化变量(全局变量或具有static存储类的变量除外)会使变量保持未初始化状态 除初始化外,任何尝试使用它的行为都会调用未定义行为

调用write_grade_message(average); 正在传递参数平均值。 但是,该函数没有参数,而是声明了一个未初始化的局部变量平均值。

该功能应该这样更新。

int write_grade_message(int average)
{
// int average; ======> then removed this line

您的问题是int write_grade_message(); 是一个可以接受任意数量参数的函数,但您不会在write_grade_message看到它们。

您必须这样声明:

int write_grade_message(int average)
{
    // your code
    if (average < 60){
        printf("Failed semester - registration suspended");
    }
    else if(average < 69){
        printf("On probation for next semester");
    }
    else if(average < 79){
        printf("");
    }
    else if(average < 89){
        printf("Dean's list for the semester");
    }
    else if(average < 100){
        printf("Highest honors for the semester");
    }

    return(0);
}

还要注意,在compute_grade_avg ,变量averagesumsize的类型为int 除以int s总是返回int ,因此ceil不会舍入该数字。 您将需要使用浮点数。 但是,您必须更改函数的类型以返回floatresultaverage必须为float

float compute_grade_avg(int grades[], int size)
{
    float result, average;

    ...

    average = ((float) sum)/size;
    result = ceil(average);

    return result;
}
  • 首先,如果您执行带有警告的原始代码,则会显示

    警告:在此函数[-Wuninitialized]中未初始化使用了“ average”,

这是因为在任何时候都不会要求用户提供average 稍微看一下代码,我们看到变量average的计算公式为average = compute_grade_avg (grades, size); 因此,必须要做的是将变量average传递给函数write_grade_message。 就像这个int write_grade_message (int average). 其次,“”将是一个空字符串,但是在C中没有这样定义空字符串,但是我想到在两个引号之间放置一个空格“”。 第三,注释Enter the number of grades that will go into the array应该用/ * * / and not //注释。 整个程序是这样的:

#include <stdio.h>
#include <math.h>

int compute_grade_avg(int grades[], int size)
{

    int i, result, average, sum=0;

    //Ask the user for the specific grades                                                                                           
    for(i=0;i<size;i++){
        printf("Enter a grade:\n");
        scanf("%d", &grades[i]);
    }

    //Calculate the sum of values in the array                                                                                       
    for(i=0;i<size;i++){
        sum += grades[i];
    }

    //Calculate the average based off of the sum and size of the array                                                               
    average = sum/size;
    result = ceil(average);

    return result;
}
//Function to print the corresponding message                                                                                      
int write_grade_message(int average)

{
    //int average=0;

    //Messages to print depending on grade                                                                                           
    if (average < 60){
        printf("Failed semester - registration suspended");
    }
    else if(average < 69){
        printf("On probation for next semester");
    }
    else if(average < 79){
        printf(" ");
    }
    else if(average < 89){
        printf("Dean's list for the semester");
    }
    else if(average < 100){
        printf("Highest honors for the semester");
    }
    return(0);
}
//Main Function                                                                                                                    
int main()
{
    int size, average;

    /*Enter the number of grades that will go into the array */                                                                       \

    printf("Enter the number of grades to be entered:\n");
    scanf("%d", &size);

    int grades[size];


    //Call compute grade average function                                                                                            
    average = compute_grade_avg(grades, size);

    //Call write grade message function                                                                                              
    write_grade_message(average);

    return(0);
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM