在C语言中,对于memcpy()来说,强制转换到(void*)是不需要的还是不可取的,就像对于malloc()来说是不需要的一样?

在C语言中,对于memcpy()来说,强制转换到(void*)是不需要的还是不可取的,就像对于malloc()来说是不需要的一样?,c,casting,malloc,void-pointers,memcpy,C,Casting,Malloc,Void Pointers,Memcpy,我对从以下网站上读到的关于memcpy()(和malloc())的内容有些困惑: 在该页中,明确说明了以下两行: 目的地 指向要复制内容的目标数组的指针,类型为void*. 来源 指向要复制的数据源的指针,类型强制转换为const void*类型的指针 但紧接着,在代码中,在使用memcpy()的以下两行中,没有对void*进行强制转换: memcpy ( person.name, myname, strlen(myname)+1 ); memcpy ( &person

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

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

目的地

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

来源

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

但紧接着,在代码中,在使用
memcpy()
的以下两行中,没有对
void*
进行强制转换:

    memcpy ( person.name, myname, strlen(myname)+1 );
    memcpy ( &person_copy, &person, sizeof(person) );
请回答由此前提产生的以下两个问题:

1)在C的情况下(与C++相反),不将
void*
中的返回类型或参数强制转换为
memcpy()
中的返回类型或参数可以吗?就像不将
malloc()
中的返回类型强制转换为
void*
可以吗,正如我直观地感觉到的那样,为什么在那个著名的网站上明确指出我们需要将它转换为void*(即使它在代码中没有使用它)。这个网站错了吗

<强> 2 < <强> >现在对这个著名站点的真实矛盾。考虑下面的

malloc()
的情况下,在描述中,与
memcpy()的情况不同,将其写入
void*
返回类型(确切的单词“.
可以转换为所需的类型”
。”)时,就好像它是
可选的一样
上面说它将被铸造到
void*
中。但是在
memcpy()
中,铸造没有完成,即使在
malloc()
的情况下,写着它将被铸造,对
void*
的强制转换已经完成,即使它是被写的
也可以被强制转换为void*
。现在我看到了C的一些错误,我们不应该强制
malloc()
返回
void*

简而言之,为了避免回答问题的人在我冗长的描述中感到困惑,请再说一遍差异:

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


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

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

指向
void
的指针可以转换为指向任何对象类型的指针,也可以转换为指向任何对象类型的指针。指向任何对象类型的指针可以转换为指向
void
的指针,然后再返回;结果应与原始指针进行比较


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

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

指向
void
的指针可以转换为指向任何对象类型的指针,也可以转换为指向任何对象类型的指针。指向任何对象类型的指针可以转换为指向
void
的指针,然后再返回;结果应与原始指针进行比较

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

->第一个问题

McCPy,C中不需要强制转换,它将在C++中。 ->关于第二个问题

malloc返回一个void指针(void*),表示它是指向未知数据类型区域的指针。由于强大的类型系统,在C++中需要使用CAST,而在C.中则不是这样的:缺少一些从MALOC返回的特定指针类型是一些程序员不安全的行为:MALOC基于字节计数而不是类型分配。这与C++的new运算符不同,它返回一个指针,其类型依赖于操作数< /p> ->第一个问题< /p>。

McCPy,C中不需要强制转换,它将在C++中。 ->关于第二个问题


malloc返回一个void指针(void*),表示它是指向未知数据类型区域的指针。由于强大的类型系统,在C++中需要使用CAST,而在C.中则不是这样的:缺少一些从MALOC返回的特定指针类型是一些程序员不安全的行为:MALOC基于字节计数而不是类型分配。这与C++的new运算符不同,它返回一个指针,该类型依赖于操作数< /p> 在C中,我们直接将空隙*分配给任何类型,反之亦然,我们不必显式类型化。
int   *i_ptr = (int *)0xABCD;   //some address
printf("address :%p\n",i_ptr);
void  *v_ptr = i_ptr;           //no need to explictly typecast
printf("address :%p\n",v_ptr);
float *f_ptr = v_ptr;           //this will throw error in cpp
printf("address :%p\n",f_ptr);
输出:

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

所有这些在C中都是有效的语句,但在CPPfloat*f_ptr=v_ptr中,将导致错误从“void*”到“float*”的无效转换。在C中,我们直接将void*指定给任何类型,反之亦然,我们不必显式地进行类型转换

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

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

所有这些都是C语言中的有效语句,但在CPP中,从“void*”到“float*”的无效转换将导致错误。我不太明白。请您在我的问题上下文中更详细地解释一下。您的答案就像
All-meat,但是很难咀嚼。你能不能把它的密度降低一点,请提供详细信息?比如为什么对
malloc()
进行强制转换,而不是对
memcpy()
进行强制转换,即使声明是对
memcpy()
进行强制转换,但对
malloc()
进行强制转换?没有详细信息。在C语言中,void*可以与任何其他指针或任何不同类型的指针进行转换,而无需使用cast、sic和simpliciter。忘了那个网站上写了什么吧,演员阵容是同步的