Pregunta

Estoy tratando de pasar un puntero de matriz de estructura y un puntero a un puntero de matriz de estructura en una función y luego modificarlo en lugar de usar un retorno.

Este código de ejemplo no tiene sentido, es solo un ejemplo de aprendizaje para mí.

Básicamente quiero crear una matriz [0] ... matriz [1] .. matriz [2] y así sucesivamente y tener un puntero que señale a estos mientras se usa un índice diferente ... como array_ref [2] apunta a array [0] y array_ref [3] apunta a array [1].

El siguiente código se compila, pero se bloquea inmediatamente. ¿Alguna sugerencia?

typedef struct unit_class_struct {
    char *name;
    char *last_name;
} person;




int setName(person * array, person ***array_ref) {
   array[0].name = strdup("Bob");
   array[1].name = strdup("Joseph");
   array[0].last_name = strdup("Robert");
   array[1].last_name = strdup("Clark");

*array_ref[2] = &array[0];
*array_ref[3] = &array[1];

    return 1;
}



int main()
{
    person *array;
    person **array_r;

   array = calloc (5, sizeof(person));
   array_r = calloc (5, sizeof(person));

   setName(array,&array_r);

    printf("First name is %s %s\n", array_r[2]->name, array_r[2]->last_name);
    printf("Second name is %s %s\n", array_r[3]->name, array_r[3]->last_name);

    return 0;
}
¿Fue útil?

Solución

Está asignando una matriz de estructuras pero declarando una matriz de punteros.

Calloc () y malloc () devuelven un objeto void * que se puede asignar a todo. Entonces, incluso con -Wall su programa se compilará sin advertencias.

Sin embargo, cuando se ejecuta, trata de lidiar con lo que usted dijo que era un conjunto de punteros, de hecho, un conjunto de punteros a punteros a punteros. Ninguno de estos punteros se ha creado. Todo lo que comienza son punteros de un nivel a una matriz de objetos. Dependiendo de lo que realmente desee, es posible que necesite algo más como ...

    array_ref[2] = &array[0];
    array_ref[3] = &array[1];

    return 1;
}


int main()
{
    person *array, *array_r_real;
    person **array_r;

    array = calloc(5, sizeof(person));
    array_r_real = calloc(5, sizeof(person));
    array_r = calloc(5, sizeof(struct unit_class_struct *));
    int i;
    for (i = 0; i < 5; ++i)
        array_r[i] = &array_r_real[i];

    setName(array, array_r);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top