#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 **));的用法,有人能解释一下第二个交换是如何工作的吗?
发布于 2015-10-12 18:47:35
在以下两行之后:
char *puppy = strdup("Wow");
char *kitty = strdup("Mew");内存使用情况如下所示:
puppy
+-----------+ +---+---+---+-----+
| address1 | -> | W | o | w | \0 |
+-----------+ +---+---+---+-----+
kitty
+-----------+ +---+---+---+-----+
| address2 | -> | M | e | w | \0 |
+-----------+ +---+---+---+-----+您可以通过以下几种方式实现交换:
交换方法1:更改指针的值。
puppy
+-----------+ +---+---+---+-----+
| address2 | -> | M | e | w | \0 |
+-----------+ +---+---+---+-----+
kitty
+-----------+ +---+---+---+-----+
| address1 | -> | W | o | w | \0 |
+-----------+ +---+---+---+-----+交换方法2:更改指针指向的内容:
puppy
+-----------+ +---+---+---+-----+
| address1 | -> | M | e | w | \0 |
+-----------+ +---+---+---+-----+
kitty
+-----------+ +---+---+---+-----+
| address2 | -> | W | o | w | \0 |
+-----------+ +---+---+---+-----+如果您想要第一种方法的行为,您需要使用:
swap(&puppy, &kitty, sizeof(char*));如果您希望使用第二种方法的行为,则需要使用:
swap(puppy, kitty, strlen(puppy));请记住,如果字符串的长度不同,则第二种方法将是一个问题。
https://stackoverflow.com/questions/33087896
复制相似问题