【发布时间】:2020-03-26 11:40:08
【问题描述】:
我正在尝试编写一个简单的函数来交换任何两个相同类型的变量。
void swap(void* a, void* b, int size);
void swap(void* a, void* b, int size){
void* temp = malloc(size);
memcpy(temp, a,size);
memcpy(a, b, size);
memcpy(b, temp,size);
free(temp);
}
int main(int argc, char* argv[])
{
char name[] = "name";
char greet[] = "greet";
swap(name, greet, 30);
printf("%s\n", name);
printf("%s\n", greet);
return 0;
}
但是上面的代码打印的是:
`
name
在memcpy(b, temp, size) 之后,a (in swap) 指向的值变为`,我不确定为什么?
【问题讨论】:
-
您不能交换
name和greet,因为它们的大小不同。而且你当然不能使用 30 的大小来交换它们,因为这比它们中的任何一个都大! -
越界将总是导致未定义的行为。
-
我在两个相同大小的字符串上测试了您的代码(将该大小作为第三个参数传递给
swap),并且成功了。所以你的swap函数看起来没问题。 -
在重新排列字符串时,使用指针并重新排列它们通常更容易、更有效,而不是复制整个字符串。
-
我应该如何更改我的函数以具有相同的定义并适用于所有类型(字符串、char、float、double、int 等)?
标签: c debugging heap-memory