web-dev-qa-db-fra.com

warning: return crée un pointeur à partir d'un entier sans transtypage mais renvoie l'entier comme souhaité

J'essaie de trouver le moyen approprié pour renvoyer un entier à partir d'un appel de fonction void * dans C.

c'est à dire .. 

#include <stdio.h>

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

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

Mais je continue à obtenir: 

warning: return rend le pointeur à partir d'un entier sans transtypage

Dois-je faire un casting pour que cela fonctionne? Il semble renvoyer x sans problème, la vraie fonction my renvoie les pointeurs sur les structures et les chaînes de caractères, qui fonctionnent tous comme prévu.

9
user2662982

Ce que vous essayez d’accomplir n’est pas évident, mais je suppose que vous essayez de faire de l’arithmétique de pointeur avec x, et voudriez que x soit un entier pour cette arithmétique mais un pointeur vide au retour. Sans entrer dans les raisons pour lesquelles cela a un sens ou non, vous pouvez éliminer l'avertissement en transformant explicitement x en pointeur vide.

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

Cela déclenchera probablement un autre avertissement, en fonction de la manière dont votre système implémente les pointeurs. Vous devrez peut-être utiliser un long au lieu d'un int.

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

Un vide * est un pointeur sur quoi que ce soit, vous devez renvoyer une adresse. 

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

Cela étant dit, vous ne devriez pas avoir besoin de renvoyer un void * pour un int, vous devriez renvoyer int * ou même mieux int

2
aaronman

Bien que vous pensiez que le moyen le plus simple de le faire serait:

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

il s'agit en fait d'un comportement indéfini, car x est alloué sur la pile et le cadre de la pile est "cumulé" au retour de la fonction. La manière idiote mais correcte est:

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

S'il vous plaît, ne jamais, jamais écrire un code comme ça, cependant.

0
1''

J'ai compilé cette source avec gcc -pedantic:

 #include <stdio.h>

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

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

Il n'y a pas d'avertissement

0
Valeriy