使用 memcpy 和 void* 交换函数

swap function using memcpy and void*

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void swap (void *vp1, void *vp2, const size_t size) {
    char *buffer = (char *)malloc(sizeof(char)*size);
    memcpy(buffer, vp1, size);
    memcpy(vp1, vp2, size);
    memcpy(vp2, buffer, size);
    free(buffer);
}

int main()
{
    char *puppy = strdup("Wow");
    char *kitty = strdup("Mew");

    printf("%s, %s\n", puppy, kitty);
    swap(&puppy, &kitty, sizeof(char **));
    printf("%s, %s\n", puppy, kitty);

    free(puppy);
    free(kitty);

    return 0;
}

我正在尝试练习以理解使用 void*memcpy()。在这段代码中,起初我认为 swap(puppy, kitty, sizeof(char *)); 它有效。但是我不明白用法swap(&puppy, &kitty, sizeof(char **)); 谁能解释一下第二次交换是如何工作的?

在下面两行之后:

char *puppy = strdup("Wow");
char *kitty = strdup("Mew");

内存使用情况如下所示:

puppy
+-----------+      +---+---+---+-----+
| address1  |  ->  | W | o | w | [=11=]  |
+-----------+      +---+---+---+-----+

kitty
+-----------+      +---+---+---+-----+
| address2  |  ->  | M | e | w | [=11=]  |
+-----------+      +---+---+---+-----+

您可以通过几种方式实现交换:

交换方法一:改变指针的值。

puppy
+-----------+      +---+---+---+-----+
| address2  |  ->  | M | e | w | [=12=]  |
+-----------+      +---+---+---+-----+

kitty
+-----------+      +---+---+---+-----+
| address1  |  ->  | W | o | w | [=12=]  |
+-----------+      +---+---+---+-----+

交换方法二:改变指针指向的内容:

puppy
+-----------+      +---+---+---+-----+
| address1  |  ->  | M | e | w | [=13=]  |
+-----------+      +---+---+---+-----+

kitty
+-----------+      +---+---+---+-----+
| address2  |  ->  | W | o | w | [=13=]  |
+-----------+      +---+---+---+-----+

如果你想要第一种方法的行为,你需要使用:

swap(&puppy, &kitty, sizeof(char*));

如果你想要第二种方法的行为,你需要使用:

swap(puppy, kitty, strlen(puppy));

请记住,如果字符串的长度不同,第二种方法会出现问题。