首页 > 解决方案 > 如何使用C中的函数动态初始化数组

问题描述

第三个问题的SS4 SS 我想创建程序来获取用户的输入,直到他按下 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;
}

标签: carraysmallocdynamic-memory-allocationrealloc

解决方案


第一个问题

随着!*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(),这会触发错误。您应该删除andfree()末尾的调用,只保留.input()display()main()

您仍然必须将printf()显示替换为

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


推荐阅读