web-dev-qa-db-ja.com

警告:returnはキャストなしで整数からポインタを作成しますが、必要に応じて整数を返します

C内のvoid *関数呼び出しから整数を返す適切な方法を見つけようとしています。

すなわち..

#include <stdio.h>

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

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

しかし、私は次のようになります。

警告:戻り値はキャストなしで整数からポインタを作成します

これを機能させるためにキャストが必要ですか?問題なくxを返すようです。実際のmyfunctionは、構造体へのポインタと文字列も返します。これらはすべて期待どおりに機能します。

10
user2662982

ここで何を達成しようとしているのかは明らかではありませんが、xを使用してポインター演算を実行しようとしていると想定します。また、xをこの演算の整数にして、戻り時にvoidポインターにしたいとします。なぜこれが意味があるのか​​理解できないのかを理解せずに、xをvoidポインターに明示的にキャストすることで警告を排除できます。

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

システムがどのようにポインターを実装しているかに応じて、これはおそらく別の警告を発生させます。 intの代わりにlongを使用する必要がある場合があります。

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

Void *は何かへのポインタであり、アドレスを返す必要があります。

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

とは言っても、intに対してvoid *を返す必要はなく、int *またはintを返す必要があります

2
aaronman

これを行う最も簡単な方法は次のようになると思いますが:

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

xはスタックに割り当てられ、関数が戻るとスタックフレームが「ロールアップ」されるため、これは実際には未定義の動作です。愚かだが正しい方法は:

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

ただし、このようなコードは決して作成しないでください。

0
1''

このソースをgcc -pedanticでコンパイルしました:

 #include <stdio.h>

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

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

警告はありません

0
Valeriy