Returning an array of structure using pointers

    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;
    }

In this example, the array [0] .name returns Jose, not Robert, as I expected, and the array [1] .name is empty.

However, if I use

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;
}

It works as expected. array.name [0] returns Robert and array.name [1] returns Jose.

Why is a second pointer required for this example? Can I do this without using a second pointer And still use pointer arithmetic?

I already know that this is another way to do this:

person * setName() {
       person * array;
       array = malloc (2 * sizeof(person));
       array[0].name = strdup("Robert");
       array[1].name = strdup("Jose");
       return array;
}
+5
source share
5 answers

In your code:

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

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

you allocate space for two elements in the array and set arrayto indicate the first:

+-------+      +----------+
| array | ---> | array[0] |
+-------+      +----------+
               | array[1] |
               +----------+

array++, , . , ( , ):

+-------+      +----------+
| array | -+   | array[0] |
+-------+  |   +----------+
           +-> | array[1] |
               +----------+

:

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

   array[0].name = strdup("Robert");
   array[1].name = strdup("Jose");
   return array;
}

. array . , array++ array-- , array :

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

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

, , . , , , ( , , , 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;
}
+18

, :

    array->name = "Robert";
    (array+1)->name = "Jose";
    return array;
+2


array, [0], [1]. :

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

, C p[x] , *(p + x), , , : (p + x)[0]. - , , x == 1. , (p + 1)[1] p[2], , , .

( ...

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

... , . ? , - ?)

+1

number ( ). , , .

+1

:

person * setName() {
       person * array;

       array = malloc (2 * sizeof(person));
       (array+0)->name = strdup("Robert");
       (array+1)->name = strdup("Jose");

       return array;
}
+1

All Articles