警告:return在没有强制转换的情况下从整数生成指针但是根据需要返回整数

时间:2013-08-08 03:25:01

标签: c function casting integer void

我正在尝试找出从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 个答案:

答案 0 :(得分:7)

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

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

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

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

答案 1 :(得分:2)

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

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

据说你不需要为一个int返回void *,你应该返回int *或者更好int

答案 2 :(得分:0)

虽然您认为最简单的方法是:

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

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

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

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

答案 3 :(得分:0)

我用 #include <stdio.h> void *myfunction() { size_t x = 5; return (void*)x; } int main() { printf("%d\n", *(int*)myfunction()); return 0; } 编译了这个来源:

"PublicSubnet1a" : {
    ...
    "AvailabilityZone": {
      "Fn::Select": ["1", { "Ref": "AZs" }] // <---- selects index 1 from AZs list
    },
    ...
"PublicSubnet1c" : {
    ...
    "AvailabilityZone": {
      "Fn::Select": ["1", { "Ref": "AZs" }] // <---- selects the same index 1 from AZs list
    },

没有警告