在 C 中,对于 memcpy() 不需要/不建议转换为 (void*),就像 malloc() 不需要它一样



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

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

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

目的地

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++相反(,不要强制void*返回类型或memcpy()中的参数是正确的和可取的,就像不强制转换为void* C中的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()的情况下,即使写得can be cast to void*,也要完成void*的铸造。现在我发现这有什么问题,因为对于C,我们不应该投malloc()回归void*

再次简单地说,这些差异,以免回答的人在我的冗长描述中感到困惑:

-

-在C中是否建议不要投void* memcpy()的返回和参数?

-

-该站点在malloc()上是否错误,因为它在 C 代码中强制转换malloc()返回到void*

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

指向void的指针可以转换为指向任何对象类型的指针,也可以从指向任何对象类型的指针转换。指向任何对象类型的指针都可以转换为指向void的指针,然后再转换回来;结果应与原始指针相等。

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

->对于第一个问题

memcpy,C中不需要演员表。它将在C++。

->第二个问题

malloc 返回一个 void 指针 (void *(,这表示它是指向未知数据类型区域的指针。由于强类型系统,C++需要使用铸件,而在 C 语言中则不是这种情况。根据一些程序员的说法,缺少从malloc返回的特定指针类型是类型不安全的行为:malloc根据字节计数而不是类型进行分配。这与返回类型依赖于操作数的指针的 C++ new 运算符不同

在 C 语言中,我们直接将 void* 分配给任何类型,反之亦然,我们不必显式类型化。

int   *i_ptr = (int *)0xABCD;   //some address
printf("address :%pn",i_ptr);
void  *v_ptr = i_ptr;           //no need to explictly typecast
printf("address :%pn",v_ptr);
float *f_ptr = v_ptr;           //this will throw error in cpp
printf("address :%pn",f_ptr);

输出:

address :0xabcd
address :0xabcd
address :0xabcd

所有这些都是 C 中的有效语句,但在 CPP float *f_ptr = v_ptr 中会导致从 'void*' 到 'float*' 的无效转换错误。

相关内容

  • 没有找到相关文章

最新更新