通过循环打印1D数组不按预期工作

时间:2015-11-13 16:57:02

标签: c arrays loops

目前,第一个函数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
}

3 个答案:

答案 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