我对从以下网站上读到的关于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*' 的无效转换错误。