这可能是一个非常愚蠢的问题,但我不明白这一点:
如果我有:
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属于同一类型。 为什么这个解决方案有效? 谢谢
答案 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);