使用 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));
请记住,如果字符串的长度不同,第二种方法会出现问题。
#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));
请记住,如果字符串的长度不同,第二种方法会出现问题。