2014-01-29 34 views
2

使用memcpy()这可能是一个非常愚蠢的问题,但我不明白这一点:为什么用C

,如果我有:

void* a; 
void* b; 

我想实现一个通用的交换功能,我为什么能做到这一点并不:

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

谢谢

我添加了这个以后:

所以,我现在明白为什么它是不可能的,但现在我还有一个问题: 由于 的sizeof(*一) 是不确定的,有人告诉我,我可以这样做:

#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); 
} 
当然

我承担和b是同一类型的。 这个解决方案为什么会起作用? 谢谢

+5

当'a'类型为'void *'时'sizeof * a'是什么? – jamesdlin

+1

我甚至没有在这里看到'memcpy' ... – pmr

+2

什么是'x'和'y' ?! – Jori

回答

12

你不能取消引用void *,没有关于它指向的数据类型的信息。所以你的代码不会编译,这就是为什么你不能这样做。

这就是void *,它是一个“指向任何东西”,并且如果不自己添加它,绝对没有其他信息可用。

如果我有:

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

,并呼吁:

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

所有信息的功能得到的是两个变量的地址。函数(或编译器)无法神奇地跟踪这些指针,并找出指向值的大小。没有。

+0

谢谢!这非常有意义! – Daniella

+0

@Daniella很高兴帮助。随意接受答案,如果你喜欢它。 – unwind

+0

如果我想创建 void swap(char *,char *);将(* a)=(* b)工作吗? – Daniella

1

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

1

要回答第二个问题,如果您通过void*指针指向它,则SWAP()宏仍不会按预期工作。或者就此而言,如果你传递了两个不同类型的指针。 它会适用于这样的事情:

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