Error: dereferencing void* pointer



  • Hi ho

    ich habe da ein Problem. Ich habe eine struct filp welche ein field private_data hat welches wiederum ein pointer ist der bei mir auf einen int zeigt. Beim initialisieren des structs zeigt er wohl auf NULL ich lege ihn dann auf einen int um:

    int this_vpid = 1;
    filp->private_data = &this_vpid;

    wenn ich nun spaeter den int wieder auslesen moechte:

    int vpid = (int)*(filp->private_data);

    bekomme ich ein warning + einen error:

    warning: dereferencing`void *' pointer
    error: void value not ignored as it ought to be

    Was mache ich falsch? thx!



  • Du solltest keine void Pointer dereferenzieren -> zuerst nach int * casten, dann brauchst du auch keinen int Cast mehr.



  • filp->private_data = malloc(sizeof(int));
    *(filp->private_data) = 1;



  • c.rackwitz schrieb:

    filp->private_data = malloc(sizeof(int));
    *(filp->private_data) = 1;

    quarkes, hier ist der hase im pfeffer:

    int vpid = *((int*)(filp->private_data));
    


  • warscheinlich ist das felt private_data vom typ void*. dereferenzieren meint, den -operator anwenden. wenn du * auf void anwendest, dann bekommst du erst mal eine warnung. dann dereferenziert dein compiler den void* tatsächlich, und das ergebnis ist dann natürlich vom typ void. wenn dann der compiler versucht, den "void-wert" zuzuweisen, bekommst du den fehler.

    um aus private_data trotz void*-typ ein int rauszuquetschen must du's so machen:

    int vpid = *(int*)filp->private_data;
    

    also erst den void* zu einem int* casten und dann dereferenzieren.

    EDIT
    sorry, hab nicht gemerkt, daß es mahlzeit bereits erfasst hatte.



  • und wo is der speicher hin, wenn die funktion einmal zu ende ist? malloc()



  • c.rackwitz schrieb:

    und wo is der speicher hin, wenn die funktion einmal zu ende ist? malloc()

    Futsch 😃

    nein, ich hab ihn nicht 😮


Log in to reply