3

memcpy() 関数を使用しようとしましたが、エラーが発生しました:

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

}

通知ショー:「アクセス違反読み取り場所0x00000001」 引数を渡すと、void * objです。問題ありません 誰か助けてくれませんか?ありがとう

4

3 に答える 3

6

コードのバグを隠すために型キャストを使用しました。変更する必要があります:

Test((void**)obj);

に:

Test(&obj);

お持ち帰りのメッセージ: 型キャストを使用する必要があると感じたときはいつでも、その理由を自問してください。ほとんどの場合、それは間違った解決策であり、より深刻な問題を覆い隠すだけです。

注: おそらく以下も変更する必要があります。

void Test(void **obj)

に:

void Test(A **obj)

ここで使用する正当な理由がないためvoid **です。

于 2012-11-27T13:41:57.943 に答える
1
void main()
{
    A *obj=(A*)malloc(sizeof(A));
    obj->a=1;
    obj->b=2;
    Test((void**)obj); //here is the problem

}

*obj のアドレスを渡しているのではなく、(A *) を (void * **),void にキャストしているだけです。

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

}

Test 関数でメモリ リークが発生しました。'object' は malloc されていますが、解放されておらず、返されていません。

于 2012-11-27T13:56:23.890 に答える