web-dev-qa-db-de.com

warning: return macht den Zeiger aus einer Ganzzahl ohne Umwandlung, gibt jedoch die gewünschte Ganzzahl zurück

Ich versuche herauszufinden, wie eine Ganzzahl aus einem void * -Funktionsaufruf in C zurückgegeben werden kann.

dh .. 

#include <stdio.h>

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

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

Aber ich bekomme immer: 

warning: return macht den Zeiger aus einer Ganzzahl ohne Besetzung

Gibt es eine Besetzung, die ich tun muss, um dies zu erreichen? Es scheint, dass x ohne Probleme zurückgegeben wird. Die echte myfunction gibt auch Zeiger auf Strukturen und Zeichenketten zurück, die alle wie erwartet funktionieren.

9
user2662982

Es ist nicht offensichtlich, was Sie hier erreichen wollen, aber ich gehe davon aus, dass Sie versuchen, Zeigerarithmetik mit x auszuführen, und möchten, dass x eine ganze Zahl für diese Arithmetik ist, aber bei der Rückgabe ein leerer Zeiger. Ohne zu verstehen, warum dies Sinn macht oder nicht, können Sie die Warnung beseitigen, indem Sie explizit x auf einen leeren Zeiger setzen.

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

Dies wird höchstwahrscheinlich eine weitere Warnung auslösen, abhängig davon, wie Ihr System Zeiger implementiert. Möglicherweise müssen Sie ein long anstelle eines int verwenden.

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

Ein void * ist ein Zeiger auf irgendetwas, Sie müssen eine Adresse zurückgeben. 

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

Sie sollten jedoch keinen void * für ein int zurückgeben, sondern int * oder noch besser nur int.

2
aaronman

Der einfachste Weg, dies zu tun, wäre:

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

dies ist eigentlich ein undefiniertes Verhalten, da x auf dem Stapel zugewiesen wird und der Stapelrahmen "zurückgerollt" wird, wenn die Funktion zurückkehrt. Der dumme, aber korrekte Weg ist:

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

Bitte schreibe niemals Code so.

0
1''

Ich habe diese Quelle mit gcc -pedantic zusammengestellt:

 #include <stdio.h>

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

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

Es gibt keine Warnungen

0
Valeriy