我试图在外部函数“add”中创建一个结构数组,并打印它的字段,但是当我回到主函数“arr”时它仍然是NULL。 我很困惑,因为我多次在外部函数中创建数组并且它起作用了..可能这次动态内存分配把事情搞砸了。我可以就此事得到建议吗? 谢谢!
typedef struct {
char* id;
char gender;
char *name;
}Member;
void add(Member arr[], int size);
void print(Member arr[], int *size);
int main()
{
char temp[100];
int size=0;
Member *arr = NULL;
Member *data = (Member*)malloc(sizeof(Member));
//scan fields
gets(temp);
data->id = (char*)malloc((strlen(temp) + 1) * sizeof(char));
strcpy(data->id, temp);
gets(temp);
data->gender = temp;
gets(temp);
data->name = (char*)malloc((strlen(temp) + 1) * sizeof(char));
strcpy(data->name, temp);
add(data, &arr, &size);
print(arr, &size);
return 0;
}
void add(Member *data, Member arr[], int *size)
{
arr = (Member*)realloc(arr, (*size + 1) * sizeof(Member));
arr[*size] = *data;
}
void print(Member arr[], int *size)
{
for (int i = 0;i < *size;i++)
{
puts(arr->id);
puts(arr->gender);
puts(arr->name);
}
}
最佳答案
想象一下这样的代码:
#include <stdio.h>
void f(int i){
i++;
}
int main(){
int i = 3;
f(3);
printf("%d\n", i);
}
我们都知道 f()
增加了 i
的本地副本,而不是传递给 f( 的变量)
来初始设置该值。话虽如此,让我们再看看您的 add()
:
void add(Member *data, Member arr[], int *size)
{
arr = (Member*)realloc(arr, (*size + 1) * sizeof(Member));
arr[*size] = *data;
}
当arr
传入函数时,它包含当前arr
的内存地址,以NULL开头。但就像我们在上面的 f()
中更改 i
的本地值一样,在 add( 中将
仅更改本地值;它不会更改 arr
设置为新值)main()
的 arr
。
我们还知道,如果我们向函数传递一个我们希望其更改的数据地址,则该函数可以更改该地址处的数据以及位于该地址将反射(reflect)调用函数的变化:
#include <stdio.h>
void f(int * i){
*i = *i + 1;
}
int main(){
int i = 3;
f(&i);
printf("%d\n", i);
}
当您想要更改指针的值时,同样的逻辑适用(尽管它会变得更加困惑);发送该指针的地址!让我们从一个非常简单的案例开始:
#include <stdio.h>
#include <stdlib.h>
void f(int** i){
*i = (int*)malloc(sizeof(int));
**i = 99;
}
int main(){
int *i = NULL;
f(&i);
printf("%d\n", *i);
}
这里我们在main中创建一个指向int
的指针,并将其初始化为NULL。然后我们将该指针的地址(即我们存储 NULL 的地址)发送到 f(),它(就像在您的程序中一样)分配一些内存并放入新分配的指针的地址_位于main 的i
的地址处。现在,存储在 &i
中的数据已更改,从 main()
取消引用 i
将取消引用新分配的地址。
在您的代码中,就像在我的代码中一样,您必须更改将 arr
传递给 add()
的方式以及与它——一项你可以从自己的思考中获得最大 yield 的练习。但简而言之,这样的事情应该可以帮助您开始:
- 传递
add
arr
的地址,而不是它存储的地址。 - 将重新分配的内存的新地址存储回同一地址,即
&arr
- 确保更新
add()
以取消引用指向指针的指针两次,以将成员设置为存储在地址&arr
处的地址>。
关于c - 如何在函数中填充结构体数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53990234/