webentwicklung-frage-antwort-db.com.de

C Doppelter Zeiger auf Struktur

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

21
linsek

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);
}
18
DwB

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

7
Ray Toal

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:

  1. Erstellen Sie eine mystruct.
  2. Machen Sie einen Zeiger darauf.
  3. Machen Sie einen Zeiger auf diesen Zeiger.
5
gspr

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;
1
luser droog

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);
}
0
Chris Eberle