我正在尝试交换两个空指针指向的内存。我得到一个错误,因为我不能对 void 或 pa 或 pb 的元素的大小执行 sizeof(因为你不能取消引用 void 指针)。问题是我无法确定 pa 和 pb 在运行时将是什么数据类型(这应该交换作为参数发送的任何数据类型)。我如何确定才能正确使用 malloc?这是我的代码:
void SwapObjects(void *pa, void *pb, size_t size)
{
void *pc;
if ((pc = (malloc(size * sizeof(pa)) == NULL))) //this is wrong {
printf("Cannot allocate memory");
return;
}
memcpy(pc, pa, size); //runtime error here
memcpy(pa, pb, size);
memcpy(pb, pc, size);
}
最佳答案
你的代码因为括号是错误的
if ((pc = (malloc(size * sizeof(pa)) == NULL)))
/* ^^ ^---------------------------------^^^
* ||________________________________________||
* |__________________________________________|
*/
如您所见,您正在将 malloc(size * sizeof(pa)) == NULL
的结果分配给 pc
,这是一个指针,当然,错了。
应该是
if ((pc = malloc(size)) == NULL)
而且你分配的内存比需要的多,试图让你的代码紧凑并不能让它变得更好,你本可以通过这样做来避免这一切
pc = malloc(size);
if (pc == NULL)
更清晰,不会出错。
如果您的代码要保持原样,您还需要free(pc)
,否则每次调用SwapObjects()
时都会发生内存泄漏.
因为它们都是指针,所以你只需要重新分配指针而不是不必要地复制数据
void SwapObjects(void **pa, void **pb)
{
void *pc;
pc = *pa;
*pa = *pb;
*pb = pc;
}
然后
SwapObjects(&pa, &pb);
在代码中没有内存泄漏的情况下会产生相同的效果。
如果您确实需要交换内容,请按照上述说明修复您的代码。
关于c - 如何在c中的两个void指针之间交换内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28511621/