void * function(void * argument),如何返回函数结果?

时间:2014-02-11 17:16:10

标签: c function pointers

我正在练习以更好地理解返回void指针的函数:void *function_t(void *arg1, void *arg2);

我写了以下代码。在函数内部,我接受两个void *参数并将它们转换为int *进行求和。得到总和后,我将返回void指向总和的指针。但我的代码不起作用。我收到了以下错误:

pointerFuncTest2.c: In function ‘main’:
pointerFuncTest2.c:23:11: error: lvalue required as left operand of assignment
pointerFuncTest2.c:27:5: error: invalid type argument of unary ‘*’ (have ‘int’)
pointerFuncTest2.c:28:43: warning: cast to pointer from integer of different size [-Wint-to-pointer-cast]
pointerFuncTest2.c:28:5: error: too many arguments to function ‘vfunc’
pointerFuncTest2.c:22:11: note: declared here

代码:

  1 #include <stdio.h>
  2 
  3   void *func_t(void *arg1, void *arg2)
  4 {
  5         int *v;
  6         *v = *(int *) arg1;
  7         int *w;
  8         *w = *(int *) arg2;
  9 
 10         int *sum;
 11         *sum = *v + * w;
 12 
 13         return (void *) sum;
 14 }
 15 
 16 
 17 
 18 
 19 
 20   int main(void)
 21   {
 22     void* vfunc(void *);
 23     vfunc = func_t;
 24 
 25     int* value1, value2;
 26     *value1 = 100;
 27     *value2 = 2;
 28     void* sumvoid = vfunc((void *)value1, (void *)value2);
 29 
 30     int *sum;
 31     *sum = *(int *) sumvoid;
 32 
 33 
 34     printf("the value of sum is now %i\n", *sum);
 35 
 36     return 0;
 37   }

3 个答案:

答案 0 :(得分:2)

要修复编译错误,需要使函数指针签名与函数的匹配:

void* (*vfunc)(void *, void*);
vfunc = func_t;

但你有更大的问题。你声明了指针,但没有将它们初始化为指向任何东西。例如:

int* value1, value2; // value1 and value2 are declared, but not initialized
*value1 = 100; // undefined behaviour because value1 is not initialized
*value2 = 2; // likewise

因此,您需要确保指针已初始化。例如:

int i;
int *p = &i;
*p = 42; // i == 42 at this point

如果函数返回void*,则需要动态分配内存。像这样:

int *retval = malloc(sizeof(int));
*retval = 666;
return retval;

当然,当您不知道指针指向的对象类型时,void*就是您使用的。如果您知道它是什么,那么使用该类型。

说完这一切之后,你的整个代码都是一种讽刺。您正在使用不需要指针的指针。您使用void*似乎没有充分的理由。


回应您的评论,您似乎想要编写如下代码:

void *func_t(int i1, int i2)
{
    int *retval = malloc(sizeof(int));
    *retval = i1 + i2;
    return retval;
}

调用者现在负责在返回的指针上调用free()。实际代码会在调用malloc时检查错误。

我真的不知道你为什么要将参数传递给void*,但是假设这是合理的事情。你的代码是:

void *func_t(void *i1, void *i2)
{
    int *retval = malloc(sizeof(int));
    *retval = *(int*)i1 + *(int*)i2;
    return retval;
}

完整的程序如下所示:

#include <stdio.h>
#include <stdlib.h>

void *func_t(void *i1, void *i2)
{
    int *retval = malloc(sizeof(int));
    *retval = *(int*)i1 + *(int*)i2;
    return retval;
}

int main(void)
{
    void* (*vfunc)(void *, void*);
    vfunc = func_t;

    int value1 = 100;
    int value2 = 2;
    void* sumvoid = vfunc(&value1, &value2);
    int sum = *(int*)sumvoid;
    free(sumvoid);
    printf("the value of sum is now %d\n", sum);
    return 0;
}

心里还是很奇怪!

答案 1 :(得分:1)

要修复编译错误,请执行以下操作:

int main(void)
{
  void * (*vfunc)(void *, void *);
  vfunc = func_t;

  int * value1, * value2;
  *value1 = 100; /* This will provoke undefined behaviour as value1 is being 
                    dereferenced without having being initialised before. 
                    If then trying to write something to the where value1 is pointing
                    to, it shall point to some allocated memory. */
  *value2 = 2;   /* Same issue here as for value1. */
  void * sumvoid = vfunc(value1, value2);

这段代码是否能达到您的预期,甚至可以运行,但这是一个不同的故事。

答案 2 :(得分:1)

在整个示例中,使用void*完全没用。

你可以写

int *v = arg1;

没有投标,因为arg1void*,但是

int *v;
*v = ...

错误,因为v未初始化。

如果你最终想要在没有分配内存的情况下返回void*,你可以声明一个静态int(不是线程安全的):

static int res = ...
return &res;

另一个错误行25:将*添加到value2

int *value1, *value2;