Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用realloc为struct中的数组分配内存?_C_Struct - Fatal编程技术网

如何使用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中初始化,但我想在function
fun
中初始化数组。在这个函数中,我想为第一个元素创建内存并将其放入数组中,为第二个元素创建内存并将其放入数组中,等等。我应该在这段代码中更改什么

#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
的每次使用更改为