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