我在stackoverflow上的answer中找到了通用交换函数的以下声明。
#define swap(x,y) do \
{ unsigned char swap_temp[sizeof(x) == sizeof(y) ? (signed)sizeof(x) : -1]; \
memcpy(swap_temp,&y,sizeof(x)); \
memcpy(&y,&x, sizeof(x)); \
memcpy(&x,swap_temp,sizeof(x)); \
} while(0)
但是如果我们在C中编写类似的函数它不起作用,我们需要明确地传递void *类型的大小才能使它工作。我理解这种情况会发生,因为宏会在调用它的函数中扩展,而sizeof会工作,因为它与变量x或y在同一范围内。我是对的吗?
如果我。请考虑以下情况。
void someComplexFunction(void* a, void* b){
swap(a,b);
}
这是对的吗?我尝试了它,它的工作原理。为什么这有效?
答案 0 :(得分:1)
您交换指针的地址但不是实际内容。
此代码显示
char *foo = "foo";
char *bar = "bar";
printf("before swap\n");
printf("foo address '%08x', foo content '%s'\n", foo, foo);
printf("foo address '%08x', foo content '%s'\n", bar, bar);
swap(foo, bar);
printf("after swap\n");
printf("foo address '%08x', foo content '%s'\n", foo, foo);
printf("foo address '%08x', foo content '%s'\n", bar, bar);
输出类似于此
before swap
foo address '010e58a8', foo content 'foo'
foo address '010e58ac', foo content 'bar'
after swap
foo address '010e58ac', foo content 'bar'
foo address '010e58a8', foo content 'foo'