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 回答
3

您不将指针的地址传递给函数,而是传递指针本身,因此在函数中与在*obj函数中相同。*objmain

使用 address-of 运算符将指针传递给指针:

Test(&obj);
于 2012-11-27T13:44:02.173 回答
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);

}

测试函数中的内存泄漏,“对象”已分配但未释放,也未返回。

于 2012-11-27T13:56:23.890 回答