【发布时间】:2013-05-08 05:30:11
【问题描述】:
我对从以下网站读到的关于memcpy()(和malloc())的内容有些困惑:
http://www.cplusplus.com/reference/cstring/memcpy/
在该页面中,明确说明了以下两行:
目的地
Pointer to the destination array where the content is to be copied, type-casted to a pointer of type void*.
来源
Pointer to the source of data to be copied, type-casted to a pointer of type const void*.
但紧接着,在代码中,在使用memcpy() 的以下两行中没有转换为void*:
memcpy ( person.name, myname, strlen(myname)+1 );
memcpy ( &person_copy, &person, sizeof(person) );
请回答由这个前提引起的以下两个问题:
1) 在 C 的情况下(相对于 C++)是否可以并且建议不要将返回类型或 @987654331 中的参数转换为 void* @ 就像在 C 中不要将 malloc() 的返回类型转换为 void* 并建议 没关系?如果是这样,我直觉地觉得,为什么在那个著名的网站上明确说明我们需要将其转换为void*(即使它没有在代码中使用它)。那个网站有错吗?
2) 现在关于那个知名网站的真正矛盾。考虑以下
http://www.cplusplus.com/reference/cstdlib/malloc/
在malloc()的情况下,在描述中,写成optional来强制转换为void*返回类型(确切的词“..can be cast to the desired type..”),不像在上面memcpy() 的情况据说将被转换为 到void*。但是在memcpy() 中,即使写入it is to be cast,转换也没有完成,在malloc() 的情况下,尽管它是写成can be cast to void*,但已完成对void* 的转换。现在我发现对于C 我们不应该转换@987654346 @返回void*。
再次简而言之,以免回答的人在我冗长的描述中感到困惑:
--C 中是否建议不要将void* 的返回值和参数转换为memcpy()?
--该站点是否对 malloc() 有误,因为它在 C 代码中将 malloc() 返回到 void*。
【问题讨论】:
-
malloc和memcpy在 C++ 中只存在边际,主要是为了与 C 兼容。C++ 有不同的构造更适合它们的类型系统。所以最好不要将 C++ 站点作为 C 的参考。它只是不同。 -
@JensGustedt 有一次我想到了,但是当我看到程序本身是 C 时,我以为是在谈论 C 的情况
-
@JensGustedt
C standard library部分中的所有程序都在 C 中。 -
从
memcpy的函数签名可以看出他们提供的不是C站点。 C中的签名不同,它有restrict,C++中不存在。 -
@JensGustedt 感谢您的洞察力。
标签: c casting malloc void-pointers memcpy