c - 如何使用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;
}
解决方案
第一个问题
随着!*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]));
推荐阅读
- reactjs - 尝试通过我的反应应用程序从 Firestore 读取和显示数据时出现错误“无法读取未定义的属性 'map'”
- session - 如何通过 Mockito 模拟超类中的方法?
- flutter - “keytool”在 Flutter 中未被识别为内部或外部命令、可运行程序或批处理文件
- python - 在Python中删除包含子字符串的字典中的值
- sql - SQL Server:使用 dm_exec_describe_first_result_set 和表变量触发 CREATE_TABLE 触发器
- python - 如何在一定范围内计算减法后的结果
- android - Pixel3 ACTION_VIEW 不会针对图像以外的其他文件启动
- javascript - 从nodejs中的数组中分组类似的字符串
- python - 未调用 Wedge 的 pick_event 处理程序
- ios - 在导航控制器中如何实现添加按钮打开一个新的视图控制器