Программа останавливается после цикла в функции - PullRequest
1 голос
/ 15 марта 2019

Моя прога не достигает функции 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 ]

3 голосов
/ 15 марта 2019

&arr[N] относится к ячейке памяти (или lvalue), которая содержит N-й элемент (вне индекса !!!) в массиве.

Этот код вызывает Неопределенное поведение (UB).

Итак, вы фактически не передавали весь массив своим функциям, вы просто пытались передать N-ый элемент этого массива ... Подробнее об этом выражении здесь .

Измените это:

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, конечно), так как вы хотите заполнить массив с плавающей точкой.

0 голосов
/ 16 марта 2019

Поскольку вы отправляете двойной указатель, когда вы делаете это:

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

выглядит так:

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

Это случается так много, когда вы работаете со структурами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...