【问题标题】:Call function of type void* with arguments of type void*使用 void* 类型的参数调用 void* 类型的函数
【发布时间】:2017-09-07 15:07:06
【问题描述】:

我有一个将从main.c 调用的函数。 函数原型是

void *function (void *args)
{ 
    Struct strData *data = args; 
    char* str;
    int a;
    str = data->name; 
    a = data->value;
    if (data->value == 1)
    { 
        data->value = 10;
        return data;
    }
}

而结构定义为

Struct strData
{
    int data;
    char* name;
};

如何从 main 调用上述函数?以及如何将整个结构从函数返回到 void*?以及如何将值发送到参数?我是否需要对函数内部参数的值进行类型转换?

【问题讨论】:

  • 你能描述一下你想通过从main调用这个函数来实现什么吗?上下文还不够清楚。
  • 为什么将args 传递为void * 而不是struct strData *
  • 看起来像XY Problem。你实际上想要达到什么目的?
  • 它必须是 void* 因为它是一个正在实现的通用函数
  • @Sona,请不要发布整个程序,而是将其精简为 minimal reproducible example

标签: c


【解决方案1】:

这里试图回答你的问题:

#include <stdio.h>

struct strData
{
//changed member name from data to value due to conflicting call in funtion
    int value;
    char* name;
};

//function takes a void pointer as parameter and returns a void pointer
//I don't understand why you have written such code below.
void *function (void *args)
{ 
    struct strData *data = args; 
    char* str;
    int a;
    str = data->name; 
    a = data->value;
    if( data->value == 1)
    {   
        data->value = 10; 
    }   

    //return statement required at the end. Why?
    return data;
}

int main(){
    //created a variable of strData
    struct strData data;
    //initialised random values
    data.value = 1;
    data.name = "stackoverflow.com";
    //pass address of the variable. Why? typecast to struct. Why? Finally get value using *. Why?
    data = *(struct strData*)function(&data);
    printf("%s %d", data.name, data.value);
    return 0;
}

回答所有质疑自己的原因。

【讨论】:

  • 谢谢王子 :) 如果结构 strData 有指针类型的对象会发生什么?我们应该发送 &data 的地址还是只发送数据?
  • 你为什么不尝试两者都做并找出答案?通过犯错你会学到很多东西。
  • 为什么你认为改变结构类型是个好主意?目前尚不清楚这是否必要,甚至是特别可取的。
  • 其实没关系。我这样做只是为了解决冲突的语句 data->value = 10;在函数中。
  • 这段代码可以编译并且可以工作,但是将void* 作为参数和返回值是完全没有意义的。绝对没有任何好处。
猜你喜欢
  • 1970-01-01
  • 2019-10-08
  • 1970-01-01
  • 1970-01-01
  • 2021-04-18
  • 1970-01-01
  • 1970-01-01
  • 2021-08-24
  • 1970-01-01
相关资源
最近更新 更多