为什么在C中使用memcpy()

时间:2014-01-29 10:10:12

标签: c memcpy

这可能是一个非常愚蠢的问题,但我不明白这一点:

如果我有:

void* a;
void* b;

我想实现一个通用交换函数,为什么我不能这样做:

void swap(void* a, void* b)
{
   void* temp = malloc(sizeof(*a));
   *a = *b;
   *b = *temp;
   free(temp);
}

谢谢

我后来添加了这个:

所以我现在明白为什么这是不可能的,但现在我有另一个问题: 以来     的sizeof(* A) 未定义,有人告诉我,我可以这样做:

#define SWAP(a,b) \
{ \
   void* temp = malloc(sizeof(*a)); \
   memcpy(temp , a , sizeof(*a)); \ 
   memcpy(a, b, sizeof(*a)); \
   memcpy(b, temp, sizeof(*a));
   free(temp);
}

当然我假设a和b属于同一类型。 为什么这个解决方案有效? 谢谢

3 个答案:

答案 0 :(得分:12)

您无法取消引用void *,也没有关于其指向的数据类型的信息。所以你的代码不会编译,这就是你不能这样做的原因。

这是void *,它是指向任何事物的指针",如果你有绝对没有其他信息可用不要自己添加。

如果我有:

char a; /* size 1 */
int b;  /* assume size 4 */

并致电:

swap(&a, &b);  /* assuming it compiled */

函数获取的所有信息是两个变量的地址。函数(或编译器)无法向后神奇地遵循这些指针并找出指向值的大小。无。

答案 1 :(得分:1)

这样你只能“复制”指针地址而不是实际数据。一旦你释放了temp,y就成了一个无效的地址。除此之外,你不会在任何情况下使用a或b

答案 2 :(得分:1)

要回答第二个问题,如果您将void*指针传递给它,您的SWAP()宏仍然无法正常工作。或者就此而言,如果你传递两个不同类型的指针。 它适用于这样的事情:

int a = 2, b = 3;
char c = '0', d = '1';
SWAP(&a, &b);
SWAP(&c, &d);