memcpy发生错误

memcpy发生错误,c,C,我尝试使用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=%

我尝试使用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。没有问题 有人能帮我吗?
谢谢

您使用了类型转换来掩盖代码中的错误。您需要更改:

Test((void**)obj);
致:

带回家的信息:每当你觉得需要使用类型转换时,问问自己为什么——在大多数情况下,这是错误的解决方案,只会掩盖更严重的问题

注意:您可能还应该更改:

void Test(void **obj)
致:


由于没有充分的理由在此处使用
void**

您没有将指针的地址传递给函数,而是传递指针本身,因此函数中的
*obj
主函数中的
*obj
相同

使用运算符的地址将指针传递给指针:

您没有传递*obj的地址,您只是将(A*)转换为(void***),void


测试函数“object”内存泄漏,但未释放,也未返回。

感谢Paul R的快速回答。但当我使用您的方式时,出现了一个新的错误:错误“无法将参数1从**转换为void**”,我更改为(Test((void**)&obj)),它运行正常。最好修复上面提到的函数
Test
,即将
void Test(void**obj)
更改为
void Test(a**obj)
。谢谢您的回答。这仍然没有编译,但当我更改为Test((void**)和obj)时。没关系。编译可能不会强制转换&obj到(void**)automatically@Ngọ康涅狄格州ỗ
void
指针可以指向任何东西,这就是为什么您永远不需要强制转换到
void*
,而只需要反过来。
void Test(void **obj)
void Test(A **obj)
Test(&obj);
void main()
{
    A *obj=(A*)malloc(sizeof(A));
    obj->a=1;
    obj->b=2;
    Test((void**)obj); //here is the problem

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

}