【问题标题】:swap function using memcpy and void*使用 memcpy 和 void* 交换函数
【发布时间】:2015-10-12 18:33:09
【问题描述】:
#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(&amp;puppy, &amp;kitty, sizeof(char **));的用法,有人能解释一下第二次交换是如何工作的吗?

【问题讨论】:

  • 应该const int sizeconst size_t size
  • 两者都不对。
  • @user3528438 - 你有什么建议?
  • 在第一种情况下,您正在交换字符串的内容,因此它要求两个操作数的长度相同,因此请使用swap(puppy, kitty, 4);。第二种情况是切换指针的值,或者,指针指向的地方,应该是swap(&amp;puppy, &amp;kitty, sizeof(char *));
  • 不要在 C 中转换 malloc

标签: c memcpy void-pointers


【解决方案1】:

在以下两行之后:

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

内存使用情况如下所示:

puppy
+-----------+      +---+---+---+-----+
| address1  |  ->  | W | o | w | \0  |
+-----------+      +---+---+---+-----+

kitty
+-----------+      +---+---+---+-----+
| address2  |  ->  | M | e | w | \0  |
+-----------+      +---+---+---+-----+

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

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

puppy
+-----------+      +---+---+---+-----+
| address2  |  ->  | M | e | w | \0  |
+-----------+      +---+---+---+-----+

kitty
+-----------+      +---+---+---+-----+
| address1  |  ->  | W | o | w | \0  |
+-----------+      +---+---+---+-----+

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

puppy
+-----------+      +---+---+---+-----+
| address1  |  ->  | M | e | w | \0  |
+-----------+      +---+---+---+-----+

kitty
+-----------+      +---+---+---+-----+
| address2  |  ->  | W | o | w | \0  |
+-----------+      +---+---+---+-----+

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

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

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

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

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

【讨论】:

  • swap(&amp;puppy, &amp;kitty, sizeof(char*));swap(&amp;puppy, &amp;kitty, sizeof(char**)); ?
  • sizeof(char*) 是正确的,因为您正在交换一个 char* 对象。
  • @AugustKarlstrom,这就是我的意思。我希望这很清楚。
  • @AugustKarlstrom,有没有更好的 ASCII 艺术来表明 address1puppy 的值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-08
  • 2014-03-08
  • 2021-01-15
  • 2018-07-27
  • 2017-07-04
  • 1970-01-01
相关资源
最近更新 更多