¿Cómo establecer el valor de la estructura indirectamente en c?

Aug 20 2020

Me gustaría saber cómo acceder al primer miembro de la estructura a través del puntero. He intentado esto:

#include <stdio.h>
#include <stdlib.h>

struct foo
{
    int a;
    char *str;
};

int main()
{
    struct foo *p = malloc(sizeof(struct foo));
    int val = 10;
    *(int**)p = &val; //set the value of the first member of struct foo
    printf("%i\n",p->a);
}

pero eso imprime algo de basura. ¿Cómo puedo configurarlo de manera similar?

Respuestas

Barmar Aug 20 2020 at 23:57

La asignación debe ser:

*(int*)p = val;

Desea asignar a un intmiembro, por lo que el puntero debe ser un puntero a int, no un puntero a int. Y el valor que se asigna debe ser int; &vales un puntero a int.

3 MatthiasBerndt Aug 21 2020 at 00:01

Lo que está haciendo allí es establecer el valor de p->aen la dirección de val(posiblemente truncado a 32 bits, según la implementación).

Para acceder al campo a través de un puntero, debe tomar la dirección del campo y luego asignarla al puntero desreferenciado.

int *pa = &p->a;
*pa = val;

Por supuesto, también puede escribir p->a = val. Tenga en cuenta que p->aes solo una abreviatura de (*p).a.