3 Stimmen

Fehler tritt bei memcpy auf

Ich habe versucht, die Funktion memcpy() zu verwenden, aber es trat ein Fehler auf:

typedef struct
    {
        int a;
        int b;
    }A;

void Test(void **obj)
{
    A *object=(A*)malloc(sizeof(A));

    memcpy(object,*obj,sizeof(A));//program crash here
    printf("a=%d\n",object->a);
    printf("b=%d\n",object->b);
    free(*obj);
    *obj=NULL;

}
void main()
{
    A *obj=(A*)malloc(sizeof(A));
    obj->a=1;
    obj->b=2;
    Test((void**)obj);

}

Die Meldung wird angezeigt: "Zugriffsverletzung beim Lesen von Speicherplatz 0x00000001" Wenn ich das Argument void* übergebe, ist obj. Es gibt kein Problem Kann mir jemand helfen? Danke

6voto

Paul R Punkte 201623

Sie haben einen Typecast verwendet, um einen Fehler in Ihrem Code zu verbergen. Das müssen Sie ändern:

Test((void**)obj);

zu:

Test(&obj);

Fazit: Wann immer Sie das Gefühl haben, dass Sie einen Typecast verwenden müssen, fragen Sie sich, warum - in den meisten Fällen ist es die falsche Lösung und verdeckt nur ernstere Probleme.

Hinweis: Sie sollten wahrscheinlich auch ändern:

void Test(void **obj)

zu:

void Test(A **obj)

da es keinen guten Grund gibt, die void ** ici.

3voto

Some programmer dude Punkte 377919

Man übergibt nicht die Adresse des Zeigers an die Funktion, sondern den Zeiger selbst, also *obj in der Funktion ist dasselbe wie *obj im main Funktion.

Verwenden Sie den address-of-Operator, um einen Zeiger an einen Zeiger zu übergeben:

Test(&obj);

1voto

Adeel Ahmed Punkte 1581
void main()
{
    A *obj=(A*)malloc(sizeof(A));
    obj->a=1;
    obj->b=2;
    Test((void**)obj); //here is the problem

}

Sie übergeben nicht die Adresse von *obj, sondern casten nur (A *) in (void * **),void

main()
{
    A *obj=(A*)malloc(sizeof(A));
    obj->a=1;
    obj->b=2;
    Test(&obj);

}

Speicherleck in der Funktion Test, 'object' wird malloced, aber weder freigegeben noch zurückgegeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X