wie verwenden Sie void-Zeiger als Funktions-Rückgabe-Typ In C
So, ich bin planing, um eine Funktion Schreiben, die Rückkehr ein zufälliges array-element. Die Funktion akzeptiert zwei
Parameter—ein array von void-Zeigern und array-Länge. Sollte es wieder ein void-Zeiger.
Die Idee ist, nehmen Sie das gegebene array, das kommt in form von einem array von void-Zeiger, den die Funktion zurückgeben ein zufälliges element aus dem array.
Die Frage die ich habe ist, was muss ich tun, um die Rückgabe eines Zeigers, was muss ich tun, um das "Ergebnis" so kann ich es zurückgeben? Nach Stationen was muss ich tun, um den Zugriff wieder?
Dank
Hier ist was ich getan habe, aber ich bin immer die:
"25: error: invalid use of void expression"
mit Warnungen wie:
" warning: pointer of type ‘void *’ used in arithmetic"
Mein code:
#include<stdlib.h>
#include<stdio.h>
#include<time.h>
void *randomNum(void * array, int length)
{
void * result;
result=array[rand()%(length-1)];
return result;
}
int main()
{
int i;
srand(13);
int array[9]={1,5,6,85,132,65463,1354,5863,134};
for (i=0;i<9; i++)
{
printf("%d\n",*randomNum(array,9));
}
return 0;
}
Es ist nicht ganz klar, was Sie versuchen zu erreichen. Wollen Sie die Rückkehr der
int
s innerhalb des array umgewandelt void*
oder hast du was zu dem zurückgeben der Adresse von diesem array-element?Warum ist jemand, den stimmberechtigten eine verwirrte Frage wie diese?
In
*randomNum(array,9)
Sie einen void-Zeiger zu dereferenzieren und damit, dass Sie "eine leere", die nicht einmal Sinn zu machen.machte eine Bearbeiten für die Frage. hoffentlich ist es klar geworden, dass Sie Jungs.
InformationsquelleAutor Jack Zhu | 2013-11-16
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie schreiben völlig in Ordnung generische Funktion auf diese Weise, aber:
Dies ist die Dereferenzierung der void-Zeiger
array
während auch der Versuch zu bewahren Sie es in einen Zeigerresult
. Das, was Sie speichern möchten, ist die Adresse, an, dass offset:Können Sie jedoch nicht ausführen Arithmetik wie diese auf void Zeiger entweder, wie die Größe der zugrunde liegende Typ ist nicht bekannt (einige Compiler erlauben
sizeof(void)==1
als Erweiterung). Mit einem non-void array, die Anzahl der bytes, die ein element verbraucht, und damit die Zahl der bytes inkrementiert, wenn dabei die Arithmetik auf die Adresse ist kodiert in der Art. In einer generischen Funktion die Bedienung auf void Zeiger wie diese müssen Sie explizit übergeben Sie die Größe des Typs.Führen Sie nun die Berechnung von Guss -
array
zu einem char-pointer, die Kräfte, die arithmetische Operationen aufarray
auftreten, in Schritten von 1 byte Zeiten der bereitgestellten size-parameter:Können Sie dann rufen randomNum mit
randomNum(array, sizeof(*array), 9)
Jedoch, Sie müssen noch umgewandelt den Rückgabewert der Funktion zu dereferenzieren, bevor es.
InformationsquelleAutor tab
Gibt es eine Reihe von Problemen mit dem Ansatz:
1) Da das argument
array
ist der Typvoid *
, Ihren plan von der Indizierung, basierend auflength
wird nicht funktionieren—für die Indizierung von arbeiten, die Länge jedes element im array muss bekannt sein, wie gut. Sie scheinen zu versuchen, eine generische Funktion, die würde der Arbeit für jeden array-Typ, aber ehrlich, es ist einfacher, um eine separate Funktion für verschiedene Typen von arrays.(Um zu sehen, warum dies problematisch ist, denken Sie daran, dass
array[index]
entspricht*(array + index)
; durch die Indizierung dervoid *
Sie sich bewerben, Zeiger-Arithmetik und dann die Dereferenzierung der void-Zeiger. Meditieren Sie auf diese.)2) Sie sind die Dereferenzierung eines void-Zeiger, wenn Sie
*randomNum(array, 9)
. Dies kann nicht durchgeführt werden; Sie müssen Stimmen die Zeiger auf eine angemessene Art ersten, d.h.,*((int *)randomNum(array, 9))
, aber wie ich oben sagte, ist der gesamte Ansatz mitrandomNum
sich in der void-Zeiger ist problematisch, so ändern Sie einfach die ganze Sache um:InformationsquelleAutor Arkku
Dein problem (gut, die, die den Fehler verursacht):
*randomNum(array,9)
Denken Sie daran, dass der Rückgabetyp der randomNum ist
void *
, die Sie dereferenzieren. Der Ausdruck ist daher nichtig. Das macht Sie nicht viel Sinn für den compiler, und gibt es eine Fehlermeldung.Nun, ich bin nicht ganz sicher warum Sie erklärt
randomNum
zurückvoid*
Sie könnten, statt nur erklärt haben, esint
. Sie effektiv konvertieren Sie einen array-Wert zu einemvoid *
, das irgendwo an den Anfang og Speicher - eine ungültige Position. Wenn Sie zum cast der Zeiger aufint*
, Ihr Programm würde segfault.InformationsquelleAutor Norwæ
Kann man nicht dereferenzieren eine
void
Zeiger wie*randomNum(array,9)
in Ihrem Programm. Sollten Sie haben, um Sie zu wirken, bevor Sie etwas mitvoid
Zeiger.InformationsquelleAutor haccks