我正在尝试找出从C中的void *函数调用返回整数的正确方法。
ie ..
#include <stdio.h>
void *myfunction() {
int x = 5;
return x;
}
int main() {
printf("%d\n", myfunction());
return 0;
}
但我一直在接受:
警告:return从没有强制转换的整数中生成指针
我需要做一个演员来完成这项工作吗?它似乎没有问题地返回x,真正的myfunction返回指向结构和字符串的指针,它们都按预期工作。
答案 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
},
没有警告