C内のvoid *関数呼び出しから整数を返す適切な方法を見つけようとしています。
すなわち..
#include <stdio.h>
void *myfunction() {
int x = 5;
return x;
}
int main() {
printf("%d\n", myfunction());
return 0;
}
しかし、私は次のようになります。
警告:戻り値はキャストなしで整数からポインタを作成します
これを機能させるためにキャストが必要ですか?問題なくxを返すようです。実際のmyfunctionは、構造体へのポインタと文字列も返します。これらはすべて期待どおりに機能します。
ここで何を達成しようとしているのかは明らかではありませんが、xを使用してポインター演算を実行しようとしていると想定します。また、xをこの演算の整数にして、戻り時にvoidポインターにしたいとします。なぜこれが意味があるのか理解できないのかを理解せずに、xをvoidポインターに明示的にキャストすることで警告を排除できます。
void *myfunction() {
int x = 5;
return (void *)x;
}
システムがどのようにポインターを実装しているかに応じて、これはおそらく別の警告を発生させます。 intの代わりにlongを使用する必要がある場合があります。
void *myfunction() {
long x = 5;
return (void *)x;
}
Void *は何かへのポインタであり、アドレスを返す必要があります。
void * myfunction() {
int * x = malloc(sizeof(int));
*x=5;
return x;
}
とは言っても、intに対してvoid *
を返す必要はなく、int *
またはint
を返す必要があります
これを行う最も簡単な方法は次のようになると思いますが:
void *myfunction() {
int x = 5;
return &x; // wrong
}
xはスタックに割り当てられ、関数が戻るとスタックフレームが「ロールアップ」されるため、これは実際には未定義の動作です。愚かだが正しい方法は:
void *myfunction() {
int *x = malloc(sizeof(int));
*x = 5;
return x;
}
ただし、このようなコードは決して作成しないでください。
このソースをgcc -pedantic
でコンパイルしました:
#include <stdio.h>
void *myfunction() {
size_t x = 5;
return (void*)x;
}
int main() {
printf("%d\n", *(int*)myfunction());
return 0;
}
警告はありません