gpt4 book ai didi

c - 为什么 memcpy 需要一个 const void 指针?

转载 作者:行者123 更新时间:2023-12-02 05:28:26 24 4
gpt4 key购买 nike

我想使用 memcpy 在可能包含任意类型的数组中执行“类型无关交换”。为什么它需要一个 const src 指针?

我写了自己的版本:

void copyBytes(char *x, char *y, int howMany){
int i;
for(i = 0; i<howMany; i++){
*(x+i) = *(y+i);
}
}

我的版本有问题吗?

最佳答案

Is there something wrong with my version?

我会这么说。这是一个批评。

void copyBytes(char *x, char *y, int howMany)

首先你的指针是char * , 这意味着除 char * 之外的任何指针类型需要显式转换。你应该使用 void * , 指针类型被隐式转换为。

uint16_t a, b;

copyBytes(&a, &b, sizeof(a)); // &a and &b are uint16_t*, not char*.

二、来源,y , 不是 const ,这意味着如果您通过 const,您将收到警告来源。

char buf[512];
const char str[] = "Hello world"; // Contents of string are constant.
copyBytes(buf, str, sizeof(str)); // With your code, this produces a warning.

第三,howMany已签名,这意味着您可以传递负值。

我会推荐这样的签名(顺便说一下,这与 memcpy 非常相似):

void copyBytes(void *x, const void *y, size_t howMany)

第四个批评 ... libc 的 memcpy可能会得到更好的优化,使用大于字节的单位、特定于平台的性能技巧(例如:内联汇编、x86 上的 SSE)等。还有 memmove当缓冲区重叠时,它具有更好的指定行为。

结论:出于学习目的自己编写这些例程很好,但通常使用 C 库会更好。

关于c - 为什么 memcpy 需要一个 const void 指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18950010/

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