1

我对从以下网站读到的关于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*.

但紧随其后,在代码void*中,以下两行中memcpy()使用的地方没有强制转换:

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

请回答由这个前提引起的以下 2 个问题:

1)在 C 的情况下(与 C++ 相对)是否可以强制转换void*为返回类型或参数,memcpy()就像在 C 中可以不强制转换void*为返回类型一样malloc()?如果是这样,正如我直觉的感觉,为什么它在那个著名的站点中明确说明我们需要将它转换到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()了铸造。现在我看到这有问题,至于C ,我们不应该铸造返回.void*can be cast to void*malloc()void*

再次简而言之,以免回答的人在我冗长的描述中感到困惑:

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

- 该站点在 C 代码中malloc()转换malloc()返回时是否错误。void*

4

3 回答 3

4

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

指向的指针void可以转换为指向任何对象类型的指针或从指向任何对象类型的指针转​​换。指向任何对象类型的指针都可以转换为指向void和返回的指针;结果应与原始指针比较。

所以你基本上不需要将 a 的结果void*转换为所需的类型,也不需要做相反的事情。

于 2013-05-14T03:33:26.177 回答
1
于 2013-05-14T07:04:29.307 回答
1

-> 第一个问题

memcpy,C 中不需要强制转换。它将在 C++ 中。

->第二个问题

malloc 返回一个 void 指针 (void *),表示它是一个指向未知数据类型区域的指针。由于强类型系统,在 C++ 中需要使用强制转换,而在 C 中并非如此。根据一些程序员的说法,缺少从 malloc 返回的特定指针类型是类型不安全的行为:malloc 基于字节数分配但不是类型。这与返回类型依赖于操作数的指针的 C++ new 运算符不同

于 2013-05-14T06:37:05.137 回答