【发布时间】:2021-12-23 23:18:16
【问题描述】:
我有这段代码应该在 a_ptr 和 b_ptr 中交换两个值:
// swaps two values inside two variables of any type
void swap(void *a_ptr, void *b_ptr)
{
size_t size = sizeof(void *);
void *tmp = malloc(size);
memcpy(tmp, a_ptr, size);
memcpy(a_ptr, b_ptr, size);
memcpy(b_ptr, tmp, size);
free(tmp);
// char wot0 = 0;
// char wot1 = 0;
// swap(&wot0, &wot1);
}
int main(){
long a = -7;
long b = 99999999;
printf("A: %ld, B: %ld\n", a, b);
swap(&a, &b);
printf("A: %ld, B: %ld\n", a, b);
printf("\n");
short c = -9;
short d = 11111;
printf("C: %hd, D: %hd\n", c, d);
swap(&c, &d);
printf("C: %hd, D: %hd\n", c, d);
printf("\n");
char ca = 'a';
char cx = 'x';
printf("CA: %c CX: %c\n", ca, cx);
swap(&ca, &cx);
printf("CA: %d CX: %c\n", ca, cx);
printf("\n");
char *str0 = "Hello, ";
char *str1 = "World!";
printf("STR0: %s STR1: %s\n", str0, str1);
swap(&str0, &str1);
printf("STR0: %s STR1: %s\n", str0, str1);
printf("\n");
return 0;
}
但是输出是:
A: -7, B: 99999999
A: 99999999, B: -7
C: -9, D: 11111
C: -7, D: -9
CA: a CX: x
CA: -9 CX: a
STR0: Hello, STR1: World!
STR0: World! STR1: Hello,
它成功地交换了a 和b,然后以某种方式将c 替换为b,并将ca 替换为d,这怎么可能?
另外,取消注释这些行:
// char wot0 = 0;
// char wot1 = 0;
// swap(&wot0, &wot1);
导致段错误,为什么?
编辑:
我想我没有很好地表达我的意图。我基本上想做的是交换指针,以便a_ptr 指向b 内部的值,b_ptr 指向a 内部的值,我不想实际复制这些值本身,我想我实现了这有点成功,不同长度的字符串(例如"Foo"和"Hello, World!")被交换而没有任何问题,我测试了这一点,但是我不明白为什么有些变量没有被交换并且实际上指向之外的值我传递给函数的
【问题讨论】:
-
要交换的目标可以是
char,也可以是double,除非明确告知,否则函数c不知道传递memcpy的大小。 -
越界访问的未定义行为。
-
@WeatherVane 什么?
sizeof(void*)原则上完美可以,根本不是编译器扩展。 -
你想改变
swap()的参数指向的对象的值吗?那么sizeof( void * )不是要复制的正确字节数,因为您想复制参数指向的内容——long、short、char——你没有认识的方式。还是您想自己更改指针(地址)?这也不起作用,因为指针本身是按值传递的,而您的swap()不能使调用者的a引用b,反之亦然。 -
@WeatherVane 我建议删除第一条评论,因为在您编辑后它仍然完全错误。