c - 如何在函数中填充结构体数组

标签 c pointers struct dynamic-memory-allocation

我试图在外部函数“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 的练习。但简而言之,这样的事情应该可以帮助您开始:

  1. 传递add arr的地址,而不是它存储的地址。
  2. 将重新分配的内存的新地址存储回同一地址,即&arr
  3. 确保更新 add() 以取消引用指向指针的指针两次,以将成员设置为存储在地址 &arr 处的地址>。

关于c - 如何在函数中填充结构体数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53990234/

相关文章:

android - 如何在Android上执行obj文件

c++ - 删除句柄类中的对象可能会导致未定义的行为

c - 字符串重新分配的意外行为

c - 在 C 和 cython 中使用结构

c - "something not a structure or union"

c++ - 如何在结构数组中显示学生姓名以及 GPA 高于平均水平的 ID

c - 如何复制或复制 gtk 小部件?

c - 结构的大小?

C - 指向 double 和 double 组的指针之间的细微差别。将一个转换为另一个?

无法正确地将值分配给自定义数据类型矩阵单元格