交换 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
。
作为练习,我尝试用一个将空指针作为参数的函数来交换变量内容。 我不明白为什么它 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
。