gpt4 book ai didi

c - 为什么在 C 中使用 memcpy()

转载 作者:行者123 更新时间:2023-12-04 11:50:02 25 4
gpt4 key购买 nike

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

如果我有:

void* a;
void* b;

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

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

谢谢

这是我后来添加的:

所以我现在明白为什么这是不可能的,但现在我有另一个问题:自从 大小(*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 是同一类型。为什么这个解决方案会奏效?谢谢

最佳答案

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

那是 void *,它是一个“指向任何东西的指针”,如果你不自己添加它,绝对没有额外的信息可用。

如果我有:

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

并调用:

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

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

关于c - 为什么在 C 中使用 memcpy(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21427840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com