如何使用C中的函数动态初始化数组

时间:2018-11-26 19:36:22

标签: c arrays malloc dynamic-memory-allocation realloc

SS4 SS of 3rd Problem 我想创建一个程序来接受用户的输入,直到他按1。 我正在使用功能使用动态内存分配,并且在运行此代码后,该程序仅接受4个输入,并且不显示任何输出 output

#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 :(得分:1)

第一个问题

使用!*arr[i],您正在检查*arr[i]中包含的逻辑值,该逻辑值在分配值之前可以具有随机值。在您的情况下,*arr[i]中包含的值为0,从而触发条件!*arr[i]

检查realoc()是否成功的正确方法是检查它的返回值。如果为空,则请求失败。就您而言,它将取代

if(!*arr[i])

作者

if(!*arr)

第二个问题

*arr[++i]=INT_MIN;行中,索引[]运算符的优先级高于指针*运算符。您必须写括号:

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

还有这里

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

您是说arr是一个数组,当它是指向数组的指针时。您应该将其替换为:

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

第三个问题

在访问数组中的值之前,您还正在执行free(),这会触发错误。您应该删除free()input()末尾的display()调用,而只保留main()末尾的一个。

您仍然需要用

替换显示的printf()

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