函数调用,将其void *参数转换为任何其他类型

时间:2019-11-05 17:07:58

标签: c casting void-pointers

在堆栈溢出时有这个问题 Why type cast a void pointer? 我想提出有关评论的问题,但由于我是新手,所以我不允许。 我的问题是在纪尧姆给出的第二个答案中,有这个功能。

void some_function(void * some_param) {
    int some_value = *((int *) some_param); /* ok */

我可以这样吗

// function defination

void some_function(void * some_param) {
    int some_value = *some_param;

// calling function, casting in argument

some_function((int *) some_param);

谢谢

1 个答案:

答案 0 :(得分:2)

在此次通话中

some_function((int *) some_param);

函数参数被隐式转换为参数void *的类型。因此,转换是多余的,并且该语句在函数中

int some_value = *some_param;

无效。

根据C标准(6.3.2.2无效)

  

1无效表达式(具有以下内容的表达式)的(不存在)值   类型void)不得以任何方式使用,无论是隐式还是显式   转换(除void之外)不得应用于此类   表达。 如果任何其他类型的表达式被评估为   无效表达式,其值或指示符将被丢弃。 (一个空白   评估其表达的副作用。)

这个表情

*some_param

函数中的类型为void

void some_function(void * some_param) {
    int some_value = *some_param;
    //...
}

关于这个问题

  

在函数调用期间,我可以将其void *参数转换为任何其他类型   在ANSI C中

您可以将类型为void *的指针分配给任何其他类型的对象而无需强制转换,也可以将类型为void *的指针强制转换为任何对象指针类型。 >