如何使用realloc为struct中的数组分配内存?
为什么我不能用这种方式为数组如何使用realloc为struct中的数组分配内存?,c,struct,C,Struct,为什么我不能用这种方式为数组x.a分配内存?编译器说,x.a并没有在main中初始化,但我想在functionfun中初始化数组。在这个函数中,我想为第一个元素创建内存并将其放入数组中,为第二个元素创建内存并将其放入数组中,等等。我应该在这段代码中更改什么 #include <stdio.h> #include <stdlib.h> typedef struct { int *a; } array; void fun(int *a,int num) { i
x.a
分配内存?编译器说,x.a
并没有在main中初始化,但我想在functionfun
中初始化数组。在这个函数中,我想为第一个元素创建内存并将其放入数组中,为第二个元素创建内存并将其放入数组中,等等。我应该在这段代码中更改什么
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int *a;
} array;
void fun(int *a,int num)
{
int i;
for(i=0;i<num;i++)
{
a=(int*)realloc(a,(i+1)*sizeof(int));
scanf("%d",(a+i));
}
}
int main(int argc,char *argv[])
{
array x;
int i,num;
scanf("%d",&num); //number of elements in array *a (in struct)
fun(x.a,num);
for(i=0;i<num;i++)
printf("%2d",x.a[i]); //prints elements
}
#包括
#包括
类型定义结构{
int*a;
}阵列;
无效乐趣(int*a,int num)
{
int i;
对于(i=0;i就像您需要传递num
的地址才能将scanf
分配给它一样,您需要传递x.a
的地址(并相应地更改匹配参数的类型,以及a
在fun
中的使用)为了从fun
内部分配给它,正如您需要传递num
的地址以让scanf
分配给它一样,您需要传递x.a
的地址(并相应地更改匹配参数的类型,以及fun
内部a
的使用)为了从内部分配给它fun
您有两个问题。第一个问题是x.a
在使用之前没有设置为值。您在main
的开头定义x
:
array x;
这将创建x
,但不会在其中放入任何内容。然后您将x.a
传递到fun
中:
fun(x.a,num);
a=(int*)realloc(a,(i+1)*sizeof(int));
这意味着要将x.a
的值传递给fun
。但是x.a
还没有值,所以这是错误的。(顺便说一下,要使代码可读。在逗号和分号后加空格,与普通英文文本中一样。)
然后,在fun
中,使用a
:
fun(x.a,num);
a=(int*)realloc(a,(i+1)*sizeof(int));
第一次执行时,a
没有正确的值,因为它是从x.a
传递的值,该值从未设置过。realloc
用于重新分配现有的分配。您必须向它传递一个初始化的指针值。(这包括NULL
;您可以传递它NULL
,表示您希望执行初始分配而不是重新分配。)
解决这些问题的最简单方法是给x.a
一个初始值,您可以通过将x
的定义更改为:
array x = { NULL };
int *fun(int *a,int num)
第二个问题是fun
从不将更新后的值传递回调用方。您对fun
的声明是:
void fun(int *a,int num)
这表示fun
接受一个指向int的指针值。当调用fun
时:
fun(x.a,num);
只传递x.a
的值。实际对象x.a
不传递,只传递其值。因此fun
无法为x.a
返回新值。有两种方法可以解决此问题。一种是更改fun
以接受指向x.a
的指针:
void fun(int **a,int num)
fun(&x.a,num)
并更改main
例程以传递x.a
的地址:
void fun(int **a,int num)
fun(&x.a,num)
并将a
在fun
中的每次使用更改为*a
:
*a=(int*)realloc(*a,(i+1)*sizeof(int));
scanf("%d",(*a+i));
另一种方法是将新指针作为fun
的返回值返回。将fun
的声明更改为:
array x = { NULL };
int *fun(int *a,int num)
当fun
返回时,将main
更改为更新x.a
:
x.a = fun(x.a,num);
通过在末尾插入以下语句,将fun
更改为返回值(不要如上所述将a
更改为*a
):
return a;
完成后,您的程序将基本正常运行,但还有两个问题需要解决:
- 当您已经知道所需的最终大小时,重复
realloc
是一种浪费。您应该只为所需大小分配一次内存。realloc
用于您需要更改的大小
realloc
可能会失败。您应该修改代码以处理失败的情况,并返回NULL
您有两个问题。第一个问题是x.a
在使用之前没有设置为值。您在main
的开头定义x
:
array x;
这将创建x
,但不会在其中放入任何内容。然后您将x.a
传递到fun
中:
fun(x.a,num);
a=(int*)realloc(a,(i+1)*sizeof(int));
这意味着要将x.a
的值传递给fun
。但是x.a
还没有值,所以这是错误的。(顺便说一下,要使代码可读。在逗号和分号后加空格,与普通英文文本中一样。)
然后,在fun
中,使用a
:
fun(x.a,num);
a=(int*)realloc(a,(i+1)*sizeof(int));
第一次执行时,a
没有正确的值,因为它是从x.a
传递的值,该值从未设置过。realloc
用于重新分配现有的分配。您必须向它传递一个初始化的指针值。(这包括NULL
;您可以传递它NULL
,表示您希望执行初始分配而不是重新分配。)
解决这些问题的最简单方法是给x.a
一个初始值,您可以通过将x
的定义更改为:
array x = { NULL };
int *fun(int *a,int num)
第二个问题是fun
从不将更新后的值传递回调用方。您对fun
的声明是:
void fun(int *a,int num)
这表示fun
接受一个指向int的指针值。当调用fun
时:
fun(x.a,num);
只传递x.a
的值。实际对象x.a
不传递,只传递其值。因此fun
无法为x.a
返回新值。有两种方法可以解决此问题。一种是更改fun
以接受指向x.a
的指针:
void fun(int **a,int num)
fun(&x.a,num)
并更改main
例程以传递x.a
的地址:
void fun(int **a,int num)
fun(&x.a,num)
并将a
内部fun
的每次使用更改为