Ich versuche einen Doppelzeiger auf eine Struktur in C zu finden und kann nicht herausfinden, was schief läuft ... Die einfache Quelle ist unten:
typedef struct
{
int member;
} mystruct;
void myfunc(mystruct **data)
{
(*data)->member = 1;
}
void main(int argc, char *argv[])
{
mystruct **data;
myfunc(data);
printf("member = %d\n", (*data)->member);
}
Eine ähnliche Frage wurde hier gestellt: Wie kann man mit Zeiger auf Zeiger auf Struktur in C arbeiten? wie man ein Element einer Struktur durch einen Doppelzeiger ändert. Die Lösung war die Syntax (*data)->member = 1;
, was Sinn macht. Aber in meiner kleinen Anwendung hier bekomme ich bei der Ausführung dieser Zeile einen Seg-Fehler. Was mache ich falsch?
Vielen Dank
Sie müssen auf etwas zeigen, wenn Sie einen Zeiger dereferenzieren möchten. Versuche dies:
void main(int argc, char *argv)
{
mystruct actualThing;
mystruct *pointer = &actualThing;
mystruct **data = &pointer;
myfunc(data);
printf("Member: %d", (*data)->member);
}
Sie haben einen Segfault erhalten, weil Sie keine Struktur zugewiesen haben.
Der Wert von data
ist "Müll". Er weist also auf eine Stelle im Speicher hin, die sich nicht im Besitz Ihres Prozesses befindet oder anderweitig nicht zugänglich ist.
Sie müssen zuerst ein Objekt vom Typ mystruct
zuordnen. Hier ist ein Arbeitsbeispiel für Sie: http://ideone.com/XIdJ8
data
ist nicht initialisiert und zeigt daher nicht auf eine sinnvolle Speicheradresse. Darüber hinaus gibt es keine mystruct
-Struktur, die herumschwebt, also gibt es auch keine vernünftigen Daten, auf die zu zeigen ist. Für Ihr Beispiel möchten Sie:
mystruct
.Wenn Sie nur den Doppelzeiger an eine Bibliotheksfunktion übergeben müssen, müssen Sie dafür keine Variable erstellen. Sie erstellen eine normale Zeigervariable, initialisieren sie so, dass sie auf den entsprechenden Speicher zeigt (falls dies von der Funktion benötigt wird), und übergeben Sie dann die Adresse des Zeigers (wodurch der Doppelzeiger "on the fly" erstellt wird).
Ich habe libusb noch nie verwendet, deshalb gebe ich ein Beispiel mit einer Standard-Bibliotheksfunktion. Aus der Manpage:
#include <stdlib.h>
long int strtol(const char *nptr, char **endptr, int base);
Nur sieht aus wie ein Doppelzeiger. Es ist wirklich ein simulierter Pass-by-Reference-Zeiger. Zulassen, dass die Funktion neben dem normalen Rückgabewert zusätzliche Informationen zurückgibt. strtol
gibt eine lange Ganzzahl zurück, kann aber auch sagen, an welcher Stelle der String-Inhalt nicht mehr wie eine Zahl aussieht.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *str = "99RED BALLOONS";
char *what;
long num;
num = strtol(str, &what, 10);
printf("Quantity: %ld; Description: %s;\n", num, what);
return 0;
}
Ausgabe:
Quantity: 99; Description: RED BALLOONS;
Sie übergeben einen Zeiger, aber der Zeiger zeigt auf nichts.
Dies kann nützlicher sein:
void main(int argc, char *argv[])
{
mystruct data;
mystruct *ptr = &data;
myfunc(&ptr);
printf("member = %d\n", (*ptr)->member);
}