使用指针返回结构数组

ZPS*_*ZPS 5 c arrays pointers return data-structures

    typedef struct unit_class_struct {
        char *name;
    } person;



person * setName() {
       person * array;
       array = malloc (2 * sizeof(person));

       array->name = strdup("Robert");
       array++;
       array->name = strdup("Jose");
       return array;
}


    int main()
    {
        person *array;

        array = setName();

        printf("First name is %s\n", array[0].name);
        printf("Second name is %s\n", array[1].name);

        return 0;
    }
Run Code Online (Sandbox Code Playgroud)

在这个例子中,array [0] .name返回Jose,而不是我预期的Robert,而array [1] .name是空的.

但是,如果我使用

person * setName() {
       person * array;
       person * array_switch;
       array = malloc (2 * sizeof(person));
       array_switch = array;
       array_switch->name = strdup("Robert");
       array_switch++;
       array_switch->name = strdup("Jose");
       return array;
}
Run Code Online (Sandbox Code Playgroud)

它按预期工作.array.name [0]返回Robert,array.name [1]返回Jose.

为什么它需要第二个指针才能使用此示例?我可以不使用第二个指针而继续使用指针算法吗?

我已经知道这是另一种方法:

person * setName() {
       person * array;
       array = malloc (2 * sizeof(person));
       array[0].name = strdup("Robert");
       array[1].name = strdup("Jose");
       return array;
}
Run Code Online (Sandbox Code Playgroud)

pax*_*blo 18

在你的代码中:

person * setName() {
   person * array;
   array = malloc (2 * sizeof(person));

   array->name = strdup("Robert");
   array++;
   array->name = strdup("Jose");
   return array;
}
Run Code Online (Sandbox Code Playgroud)

你为数组中的两个元素分配空间并设置array为指向第一个元素:

+-------+      +----------+
| array | ---> | array[0] |
+-------+      +----------+
               | array[1] |
               +----------+
Run Code Online (Sandbox Code Playgroud)

然后用元素指针递增array++,就是最后返回到调用函数的内容.该指针指向第二个数组元素,这就是为什么它似乎是错误的(为什么你几乎肯定会崩溃,当你试图稍后释放该内存时):

+-------+      +----------+
| array | -+   | array[0] |
+-------+  |   +----------+
           +-> | array[1] |
               +----------+
Run Code Online (Sandbox Code Playgroud)

你需要的是:

person * setName() {
   person * array;
   array = malloc (2 * sizeof(person));

   array[0].name = strdup("Robert");
   array[1].name = strdup("Jose");
   return array;
}
Run Code Online (Sandbox Code Playgroud)

正如你已经指出的那样.此解决方案根本不会更改array指针.但是,如果你真的想使用指针,你可以在返回之前反转array++with 的动作,array--以便将array其设置回正确的值:

person * setName() {
   person * array;
   array = malloc (2 * sizeof(person));

   array->name = strdup("Robert");
   array++;
   array->name = strdup("Jose");
   array--;
   return array;
}
Run Code Online (Sandbox Code Playgroud)

或者,另一种不改变原始指针的方法,不使用数组索引而不使用第二个指针就是使用指针算法.编译器知道指针指向的是什么类型,因此可以正确调整指针以找到下一个元素(您已经知道它知道如何执行此操作,因为它array++是简写,array = array + 1并且该语句也调整了正确的值):

person * setName() {
   person * array;
   array = malloc (2 * sizeof(person));

   (array+0)->name = strdup("Robert");
   (array+1)->name = strdup("Jose");
   return array;
}
Run Code Online (Sandbox Code Playgroud)