[英]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
,变量average
, sum
和size
的类型为int
。 除以int
s总是返回int
,因此ceil
不会舍入该数字。 您将需要使用浮点数。 但是,您必须更改函数的类型以返回float
, result
和average
必须为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.