gpt4 book ai didi

c - 在 C 语言中,memcpy() 是否不需要/不建议强制转换为 (void*),就像 malloc() 不需要一样?

转载 作者:太空宇宙 更新时间:2023-11-04 01:09:08 24 4
gpt4 key购买 nike

我对从以下站点读到的有关 memcpy()(和 malloc())的内容有些困惑:

http://www.cplusplus.com/reference/cstring/memcpy/

在该页面中,明确说明了以下两行:

目的地

指向要复制内容的目标数组的指针,类型转换为 void* 类型的指针。

来源

指向要复制的数据源的指针,类型转换为 const void* 类型的指针。

但在那之后,在代码中,在使用 memcpy() 的以下两行中没有转换为 void*:

    memcpy ( person.name, myname, strlen(myname)+1 );
memcpy ( &person_copy, &person, sizeof(person) );

请回答由此前提产生的以下2个问题:

1) 在 C 的情况下(相对于 C++)是否可以建议不要将返回类型转换为 void*memcpy() 中的参数,因为它是正确的并且建议不要将 malloc 的返回类型转换为 void* () 在 C 中?如果是这样,正如我的直觉,为什么在那个著名的站点中明确声明我们需要将其转换为 void* (即使它没有在代码中使用它)。该网站是否有误?

2) 现在关于那个知名网站的真正矛盾。考虑以下内容

http://www.cplusplus.com/reference/cstdlib/malloc/

malloc() 的情况下,在描述中,它被写成好像它是 optional 来转换为 void*返回类型(确切的词“..可以转换为所需的类型..”),不像上面提到的 memcpy() 的情况 < strong> 将被转换为 void*。但是在 memcpy() 中,转换没有完成,即使它被写成 被转换,在malloc()的情况下,转换到void*已经完成,即使它被写成可以被转换到void *。现在我发现这里有一些问题,对于 C 我们不应该将 malloc() 的返回值转换为 void*.

再次简要说明差异,以免回答的人对我冗长的描述感到困惑:

--在 C 中是否建议不要将 memcpy() 的返回值和参数转换为 void*

--该网站关于 malloc() 是否有误,因为它将 malloc() 转换为 C 代码中的 void*

最佳答案

来自 C 语言规范的 ISO/IEC 9899:2011,第 6.3.2.3 节,第 55 页:

A pointer to void may be converted to or from a pointer to any object type. A pointer to any object type may be converted to a pointer to void and back again; the result shall compare equal to the original pointer.

所以您基本上不需要将 void* 的结果转换为所需的类型,您也不需要执行相反的操作。

关于c - 在 C 语言中,memcpy() 是否不需要/不建议强制转换为 (void*),就像 malloc() 不需要一样?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16534628/

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