目前,第一个函数info()
正常工作并返回整个数组。这似乎也传递给kurtosis()
函数,因为我已经测试过,看看每个元素是否手动打印在函数中。但是,当试图通过循环打印每个元素时,它似乎只在第一次迭代中打印该值;对于之后的迭代,它打印0
。奇怪的是,当用一个常数替换i
时,这仍然会发生。
#include <stdio.h>
double * info(){//function for obtaining up to 10 numbers
int i;
int x=0;
double numbers[10];
for (i = 1; i < 11; i++){
printf("\nPlease enter value %d:", i);
scanf("%lf", &numbers[i]);
x++;//counting number of entries
if(numbers[i] <0){//stops accepting numbers if user enters negative number
x--;
numbers[i] = -1;
break;
}
}
printf("%d numbers entered.\n", x);
return numbers;
}
double kurtosis(double * numbers){
int i, x;
double mean, numerator, denominator, sum;
for (i = 1; i < 11; i = i + 1){ //irrelevant loop; will be used later on
if (numbers[i] == -1){
x = i-1;
break;
}
}
for (i = 1; i < 10; i++){
printf("%lf\n", numbers[i]);//printing each value in the array
}
}
int main(void){
double * numbers = info();
double kurtno;
kurtno = kurtosis(numbers);//passing the array to the kurtosis function
}
答案 0 :(得分:1)
您的代码中存在一些问题。
double numbers[10];
这是函数info()
的本地数组。函数返回后访问它会调用Undefined Behavior。
函数kurtosis()
的{{1}}类型为return
,但double
没有返回任何内容。
如果您尝试在kurtosis()
函数中number[]
访问info()
数组,那么也会出错。
数组索引始终从kurtosis()
开始。因此0
的索引从number[10]
开始到0
。
循环9
将访问超出范围的for (i = 1; i < 11; i = i + 1)
。
将其更改为
number[10]
使其有效
使用for (i = 1; i < 10; i = i + 1)
。使用malloc()
分配的内存在函数调用之间保持范围。
malloc()
答案 1 :(得分:0)
代码中的主要问题是,在您的函数info()
中,numbers
是该函数的本地问题。当您从函数调用返回时,numbers
的生命周期已用完,因此,在调用者中,返回的地址不再有效。通过返回该函数的地址并在以后使用它,您将调用undefined behavior。
另外,正如其他人所说,第二个函数没有返回值。
然后,循环
for (i = 1; i < 11; i++)
也是错误的,因为C数组有基于0的索引。循环应该运行
for (i = 0; i < 10; i++)
答案 2 :(得分:0)
您的第一个函数返回一个局部变量,其范围在函数块内。
尽管类型为double
,但您的第二个函数不会返回任何内容。
他们都会调用未定义的行为。
要添加更多循环条件,访问索引将超出UB的另一个原因。循环条件应为i=0
直到i<10
(其他人也指出)。
你能做的是 -
1。在函数info
中,声明为double *
并为其分配内存。
2. 将数组从调用函数本身传递给函数info
。