memcpy发生错误
我尝试使用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=%
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);
}