交换 C 变量

Swapping C variable

作为练习,我尝试用一​​个将空指针作为参数的函数来交换变量内容。 我不明白为什么它 return 总是第一个变量的随机值。

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

void swap(void* vp1, void* vp2, int size)
{ 
  char buffer[size];
  memcpy(buffer, vp1, size);
  memcpy(vp1, vp2, size);
  memcpy(vp2, buffer, size);
}

void main()
{
  int g1 = 243;
  int g2 = 28;

  printf("g1 before swap = %i\n", g1);
  printf("g2 before swap = %i\n", g2);

  printf("&g1 = %p\n", &g1);
  printf("&g2 = %p\n", &g2);

  swap(&g1, &g2, sizeof(int*));

  printf("-------------------------\n");

  printf("g1 after swap = %i\n", g1);
  printf("g2 after swap = %i\n", g2);

  printf("&g1 = %p\n", &g1);
  printf("&g2 = %p\n", &g2);
}
./swap
g1 before swap = 243
g2 before swap = 28
&g1 = 0x7ffee832072c
&g2 = 0x7ffee8320728
-------------------------
g1 after swap = -399374528
g2 after swap = 243
&g1 = 0x7ffee832072c
&g2 = 0x7ffee8320728

例子直接取自this course,虽然很有趣

您正在交换错误的大小,在您的系统上 sizeof (int*) 大于 sizeof (int)

正如我们从您的输出中看到的那样,sizeof (int*) 是 8,但 sizeof (int) 是 4。当从 g1 复制到 buffer 时,又获取了 4 个字节,这将 buffer 复制到 g2 时会覆盖 g1 的内容。

将调用改为

swap(&g1, &g2, sizeof g1);

如果您想知道像 g1 这样的对象的大小,请使用 sizeof g1