Как динамически инициализировать массив с помощью функции в C - PullRequest
0 голосов
/ 26 ноября 2018

SS4 SS 3-й задачи Я хочу создать программу, которая будет принимать ввод от пользователя, пока он не нажмет 1. Я использую динамическое выделение памяти с помощью функции и после запуска этогокод, эта программа принимает только 4 ввода и не показывает никакого вывода вывод

#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
void input(int **arr)
{
  int n=1,i=0;
  *arr=(int *)malloc(sizeof(int));
  int ch;
  do
  {
    printf("\nEnter '1' To Enter A Value in array or else enter '0'");
    scanf("%d",&ch);
    if (ch==1)
    {
      if (!*arr)
      {
        printf("\nInsufficient Memory!");
        return;
      }
    printf("\nEnter the value\t:\t");
    scanf("%d", arr[i]);
    *arr=realloc(*arr,sizeof(int)*(++n));
    *arr[++i]=INT_MIN;
  }
  else if (ch!=1&&ch!=0)
  {
    printf("\nInvalid input!");
    continue;
  }
} while(ch!=0);
free(arr); 
}
void display(int **arr)
{
  for (int i = 0; i < 3; i++)
  printf("\n%d", **(arr+i));
  free(arr); 
}
int main()
{
  int *arr;
  input(&arr);
  display(&arr);
  free(arr); 
  return 0;
}

1 Ответ

0 голосов
/ 26 ноября 2018

Первый вопрос

С помощью !*arr[i] вы проверяете логическое значение, содержащееся в *arr[i], которое может иметь случайное значение, прежде чем присваивать ему значение.В вашем случае значение, содержащееся в *arr[i], равно 0, вызывая условие !*arr[i].

. Правильный способ проверки, если realoc() был успешным, - это возврат его возвращаемого значения.Если он нулевой, запрос не выполнен.В вашем случае это будет замена

if(!*arr[i])

на

if(!*arr)

Второй вопрос

В этой строке*arr[++i]=INT_MIN; оператор index [] имеет приоритет над оператором указателя *.Вы должны написать круглые скобки:

(*arr)[++i]=INT_MIN;

А также здесь

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

вы говорите, что arr является массивом, когда это указатель на массив.Вы должны заменить его на:

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

Третий вопрос

Вы также делаете free() перед тем, как получить доступ к значениям в массиве, что вызывает ошибку.Вы должны удалить вызовы free() в конце input() и display() и оставить только один конец main().

Вам все еще нужно заменить printf() на дисплее на

printf("\n%d", (*arr)[i]));

...