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.
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;
}
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
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.
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