c - 如何在c中的两个void指针之间交换内存

标签 c dynamic-memory-allocation

我正在尝试交换两个空指针指向的内存。我得到一个错误,因为我不能对 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/

相关文章:

c - 为什么字符串的字节大小比长度长?

检查 charArray 是否只有十六进制数字

c - MCU 中的 RTC 初始化 - 为什么使用全局回调

c - C 中 'free' 的奇怪行为

c++ - 段错误 : 11 ? C++

c - 如何为连接重新分配字符指针?

c - 在 c 中使用系统调用传递命令时,输出不显示任何内容?

c - 使用动态内存分配的插入排序

你能在运行时用 C 定义数组的大小吗

c++ - 了解具有动态内存分配的二维数组