Warnung: return macht die Zeiger von Ganzzahl ohne einen cast gibt aber integer wie gewünscht
Ich versuche, herauszufinden, der richtige Weg, um eine ganze Zahl, die von einem void * Funktionsaufruf in C.
ie ..
#include <stdio.h>
void *myfunction() {
int x = 5;
return x;
}
int main() {
printf("%d\n", myfunction());
return 0;
}
Aber ich bekomme immer:
Warnung: return macht die Zeiger von Ganzzahl ohne cast
Gibt es eine Besetzung, die ich tun müssen, um diese Arbeit zu machen? Es scheint return x ohne problem, die real myfunction gibt auch Zeiger auf Strukturen und Zeichen-strings, die alle Arbeit, wie erwartet.
- Warum machst du das?
myfunction
Rückgabetyp istvoid*
aber die Art derx
istint
. Warum wollen Sie, damit es funktioniert ? Was ist die eigentliche Funktion, die Sie zu tun ?- Einen guten Grund gibt: die Aufrechterhaltung der code, hat jemand anderes getan.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist nicht klar, was Sie versuchen zu erreichen, hier, aber ich nehme an, Sie versuchen zu tun, einige Zeiger-Arithmetik mit x und hätte gerne, dass x eine ganze Zahl für das arithmetische, sondern ein void-Zeiger auf die Rückkehr. Ohne sich in, warum diese nicht oder nicht sinnvoll ist, können Sie beseitigen die Warnung durch explizites casting x ein void-Zeiger.
Diese wird wahrscheinlich raise eine weitere Warnung, je nachdem, wie Ihr system implementiert Zeiger. Möglicherweise müssen Sie verwenden eine lange statt einer int.
int
breiter ist dann einvoid *
, also die Umwandlung der alten auf die letztere würde verlieren bits. Also, wenn die Speicherung eines integer in eine Zeiger-variable wirklich nötig ist, könnte man überlegen, die Deklaration der integer-alsintptr_t x;
oderuintptr_t x;
alsintptr_t
unduintptr_t
sind garantiert durch den C-standard zu passen in eine Zeiger-variable.return (void *) 5;
.Ein void * ist ein Zeiger auf etwas, das Sie brauchen, um wieder eine Adresse.
Diesem wird gesagt, sollten Sie nicht brauchen, um wieder eine
void *
für ein int, sollten Sie Sie wiederint *
oder noch besser einfachint
new
Betreiber inC
.malloc(sizeof(int))
.void*
sowiesoObwohl Sie würden denken, dass der einfachste Weg, dies zu tun wäre:
dies ist tatsächlich ein Undefiniertes Verhalten, da x auf dem Stapel reserviert, und der stack-frame ist "aufgerollt", wenn die Funktion zurückgibt. Das dumme wird aber der korrekte Weg ist:
Bitte nie, nie schreiben Sie code wie diesen, obwohl.
void*
zurück. Was mag albern sein, ist wieder nur eine einzelne ganze Zahl statt einer Struktur. Diese Art von Funktion wird oft verwendet als Teil einer callback, so dass der Benutzer callback zurückgeben kann, eine Daten-Zeiger.void *
mit Strukturen macht Sinn, aber für eine einzelne ganze Zahl kann man nur zurückgeben int, es sei denn, Sie sind erforderlich, um zurückvoid *
weil es einen Rückruf.Den ich kompiliert habe, ist diese Quelle mit
gcc -pedantic
:Gibt es keine Warnungen