scanf из функции в массив - PullRequest
       8

scanf из функции в массив

0 голосов
/ 07 октября 2018

Я пытаюсь отсканировать значения в массив из другой функции, используя указатель на указатель.Вот код:

int initialize(int **arr, int count);

int main()
{
    int count;
    int *numbers;
    scanf("Enter the amount of numbers to enter: %d", &count);
    initialize(&numbers, count);
    free(numbers);
    return 0;
}

int initialize(int **arr, int count)
{
    int i = 0;
    *arr = calloc(count, sizeof(int));
    while(i < count)
    {
        printf("Nr. %d: ", i + 1);
        scanf("%d", &arr[i]);
        i++;
    }

    return 0;
}

Он правильно распределяет память, однако, похоже, что проблема в функции scanf при инициализации, поэтому она вылетает после чтения первых 2 чисел.Не могли бы вы помочь решить это?

1 Ответ

0 голосов
/ 07 октября 2018

arr - указатель на указатель на int, поэтому сначала установите указатель на int (перед его использованием в качестве массива), выполнив *arr.

Так что

    scanf("%d", &arr[i]);

должно быть

    scanf("%d", &(*arr)[i]);

или его более коротким эквивалентом

    scanf("%d", *arr + i);

Не связано, но в C оно должно быть не менее

int main(void)

Не связано ^ 2: Размеры и индексы в C best определяются с помощью size_t (идет с stdlib.h).

Таким образом, соответствующая часть вашего кода будет выглядеть так:

int main(void)
{
  size_t count;
  int *numbers;
  scanf("Enter the amount of numbers to enter: %zu", &count);
  ...

int initialize(int **arr, size_t count)
{
  size_t i = 0;
  *arr = calloc(count, sizeof(int));
  while (i < count)
  ...

И, наконец, код не пропускает проверку ошибок для соответствующих функций:

  • scanf()
  • calloc()

Проверка ошибок (вместе с регистрацией ошибок) отлаживается бесплатно!

...