2015-11-13 41 views
0

当前,第一个函数info()工作正常并返回整个数组。这似乎也传递给kurtosis()函数也正常,因为我已经测试过,看看每个元素是否手动打印在函数中。但是,当试图通过循环打印每个元素时,它似乎只在第一次迭代中打印该值;对于此后的迭代,它会打印0。奇怪的是,当用固定数字替换i时,仍然发生这种情况。打印1D数组通过循环未按预期工作

#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

在你的代码的主要问题是,在你的函数info()numbers是局部的功能。当您从函数调用返回时,numbers将耗尽其生命周期,因此,在调用方中,返回的地址不再有效。通过返回该函数的地址并稍后使用它,您将调用undefined behavior

另外,如其他人所述,第二个函数缺少返回值。

然后,环路

for (i = 1; i < 11; i++) 

也是错误的,如C数组具有基于0的索引。循环应运行

for (i = 0; i < 10; i++) 
+0

这是我找到的将函数返回给main的唯一方法,是否还有另外一种可以建议的方法?另外就基于0的索引而言,这是我的想法,但它似乎适用于基于1的索引。 – Ollie

+0

@Ollie是的,让'numbers'成为一个指针,使用'malloc()'动态分配内存,然后你可以从'info()'返回'numbers'。 –

+0

@Ollie还有,_seem_工作是[UB]的许多_beauties_之一(https://en.wikipedia.org/wiki/Undefined_behavior) –

1

代码中存在一些问题。


double numbers[10]; 

这是本地阵列到功能info()。一旦函数返回,访问它将调用未定义的行为。


功能kurtosis()return类型为double,但没有正从kurtosis()返回。


如果你正试图从info()访问number[]数组中的功能kurtosis(),那么也有错误。

数组索引总是从0开始。所以number[10]将有指数从09

循环for (i = 1; i < 11; i = i + 1)将访问number[10]这是出界。

将其更改为

for (i = 1; i < 10; i = i + 1) 

,使其工作

使用malloc()。使用malloc()分配的内存保留在函数调用之间的范围内。

double* numbers = malloc(10*sizeof(double)); 
+0

以及循环条件。 –

+0

谢谢,是否有另一种方法可以推荐返回数组表单info(),因为这是我找到的唯一方法。 – Ollie

+0

@Ollie,更新,看看。 – Haris

0

您的第一个函数返回一个局部变量,其范围位于功能块内。

即使类型为double,您的第二个函数也不会返回任何内容。

二者都调用未定义的行为

要添加更多您的循环条件访问索引越界UB的另一个原因。环路条件应为i=0,直到i<10(其他人也指出)。

你可以做的是 -

在功能info,声明为double *和内存分配给它。

2.从调用函数本身传递数组到函数info