循环功能后程序停止

时间:2019-03-15 17:16:40

标签: c arrays function loops

我的编没有达到outArray函数。它在fillArray函数循环后停止。为什么会这样。它看起来很奇怪,因为它是简单的void函数,不应返回任何内容。这应该继续在main中运行命令。而且该程序像往常一样停止,没有任何问题和错误

#include <stdio.h>
#define N 100

int enterNofArray();
void fillArray(int n, float arr[N]);
void outArray(int n, float arr[N]);

int main()
{
    float arr[N], sum = 0.0, average;
    int n;

    //input
    n = enterNofArray();

    //compute
    fillArray(n, &arr[N]);

    //output
    outArray(n, &arr[N]);

    return 0;
}


int enterNofArray()
{
    int n;
    printf("Enter amount of array...\n");
    scanf("%d", &n);

    while (n < 1 || n > N)
    {
        printf("Incorrect!!\n");
        printf("Enter in range 1 - 100...\n");
        scanf("%d", &n);
    }

    return n;
}

void fillArray(int n, float arr[N])
{
    int num;
    for(int i = 0; i < n; i++)
    {
        printf("Enter number for array[%d times left]...\n", n - i);
        scanf("%d", &num);
        arr[i] = num;
    }
}

void outArray(int n, float arr[N])
{
    for(int i = 0; i < n; i++)
    {
        printf("%f ", arr[i]);
    }
}

2 个答案:

答案 0 :(得分:3)

&arr[N]是指包含数组中第N个元素(索引之外!!)的内存位置(或左值)。

该代码调用未定义行为(UB)。

因此,您实际上并没有将整个数组传递给函数,而只是试图传递该数组的第N个元素...了解有关该表达式here的更多信息。

更改此:

fillArray(n, &arr[N]);
outArray(n, &arr[N]);

对此:

fillArray(n, arr);
outArray(n, arr);

Live Demo

问题是您的代码n已损坏,在调用fillArray函数之后包含垃圾值。结果,在调用outArray函数时,n的值为垃圾值,这导致了不受控制的for循环,最终导致循环的次数远远超出了数组的限制,最终访问了您所需要的内存不拥有,从而导致细分错误。


不是造成问题的原因,但是我建议您在scanf("%f", &num);函数中执行fillArray(当然,在将num声明为float之后),因为您想要填充浮点数数组。

答案 1 :(得分:0)

因为执行此操作时会发送双指针:

fillArray(n,&arr [N]); outArray(n,&arr [N]);

看起来像:

fillArray(n,** arr); outArray(n,** arr);

当您使用Structures时,会发生如此多的事情。