【问题标题】:function call, casting its void * argument to any other type函数调用,将其 void * 参数转换为任何其他类型
【发布时间】:2019-11-05 17:07:58
【问题描述】:

堆栈溢出有这个问题 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);

谢谢

【问题讨论】:

    标签: c casting void-pointers


    【解决方案1】:

    在本次通话中

    some_function((int *) some_param);
    

    函数参数被隐式转换为参数的类型void *。所以强制转换是多余的,函数中的这个语句

    int some_value = *some_param;
    

    无效。

    根据 C 标准(6.3.2.2 无效)

    1 void 表达式的(不存在的)值(具有 type void) 不得以任何方式使用,无论是隐式还是显式 转换(无效除外)不适用于此类 表达。 如果任何其他类型的表达式被评估为 void 表达式,其值或指示符被丢弃。 (避免 表达式的副作用被评估。)

    还有这个表达

    *some_param
    

    在函数中具有 void 类型

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

    至于问题

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

    您可以将void * 类型的指针分配给指向任何其他类型对象的指针而不进行强制转换,或者您可以将void * 类型的指针强制转换为任何对象指针类型..

    【讨论】:

    • @vkchavda 问题被赞成和反对的地方有一个标记。
    猜你喜欢
    • 1970-01-01
    • 2011-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    相关资源
    最近更新 更多