10

我试图找出从 C 中的 void * 函数调用返回整数的正确方法。

IE ..

#include <stdio.h>

void *myfunction() {
 int x = 5;
 return x;
}

int main() {
  printf("%d\n", myfunction());
  return 0;
}

但我不断得到:

警告:return 从整数中生成指针而不进行强制转换

我需要做演员才能完成这项工作吗?似乎返回 x 没有问题,真正的 myfunction 返回指向结构和字符串的指针,它们都按预期工作。

4

4 回答 4

9

您在这里尝试完成什么并不明显,但我假设您正在尝试对 x 进行一些指针算术,并且希望 x 是这个算术的整数,但返回时是一个 void 指针。在不了解为什么这样做有意义或没有意义的情况下,您可以通过将 x 显式转换为 void 指针来消除警告。

void *myfunction() {
 int x = 5;
 return (void *)x;
}

这很可能会引发另一个警告,具体取决于您的系统如何实现指针。您可能需要使用 long 而不是 int。

void *myfunction() {
 long x = 5;
 return (void *)x;
}
于 2013-08-08T04:32:00.500 回答
2

void * 是指向任何东西的指针,您需要返回一个地址。

void * myfunction() {
  int * x = malloc(sizeof(int));
  *x=5;
  return x;
}

话虽如此,您不需要void *为 int 返回 a,您应该返回int *甚至更好int

于 2013-08-08T03:27:51.860 回答
0

尽管您认为最简单的方法是:

void *myfunction() {
  int x = 5;
  return &x; // wrong
}

这实际上是未定义的行为,因为 x 是在堆栈上分配的,并且当函数返回时堆栈帧被“卷起”。愚蠢但正确的方法是:

void *myfunction() {
  int *x = malloc(sizeof(int));
  *x = 5;
  return x;
}

不过,请永远不要写这样的代码。

于 2013-08-08T03:30:58.100 回答
0

我编译了这个源代码gcc -pedantic

 #include <stdio.h>

 void *myfunction() {
   size_t x = 5;  
   return (void*)x;
 }

 int main() {
   printf("%d\n", *(int*)myfunction());
   return 0;
 }

没有警告

于 2016-01-05T15:32:48.037 回答