C: Wie man einen Doppelzeiger an eine Funktion übergibt

Lesezeit: 4 Minuten

Ich erhalte einen Segmentierungsfehler, wenn ich die doppelten Zeiger an die Funktion übergebe, um den Speicher zu initialisieren

int main()
{
    double **A;
    initialize(A, 10, 10);
 ......
}

void initialize(double **A, int r, int c)
{
   A = (double **)malloc(sizeof(double *)*r);
   for(int i = 0; i< r; i++) {
        A[i] = (double *)malloc(sizeof(double) *c);
        for(int j = 0; j < c; j++) {
            A[i][j] = 0.0;
        }
   }
}

Wie kann ich die Doppelzeiger an die Funktionen übergeben…..

  • Das wird nicht kompiliert, ohne initialize zu ändern — &A ist ein double***.

    – Stuart Golodetz

    2. Dezember 2010 um 20:01 Uhr

Wie andere gesagt haben, müssen Sie in Ihrer Init-Funktion einen Zeiger auf Zeiger auf Zeiger nehmen. So geht die initialize Funktionsänderungen:

void initialize(double ***A, int r, int c)
{
   *A = (double **)malloc(sizeof(double *)*r);
   for(int i = 0; i< r; i++) {
        (*A)[i] = (double *)malloc(sizeof(double) *c);
        for(int j = 0; j < c; j++) {
            (*A)[i][j] = 0.0;
        }
   }
}

Und main wird sein:

int main()
{
    double **A;
    initialize(&A, 10, 10);
}

Außerdem sollte der Code, wie Sie ihn gepostet haben, beim Übergeben von keinen Segmentierungsfehler verursachen A Zeiger hinein. Der Segmentierungsfehler tritt höchstwahrscheinlich auf, wenn Sie von der Funktion zurückkehren und versuchen, darauf zuzugreifen Aweil die A in main wird nicht initialisiert. Nur eine Kopie davon wird so initialisiert, wie Sie es tun, und diese Kopie ist lokal für die initialize Funktion, also geht es verloren, wenn Sie zurückkehren.

  • @LVlad Hallo, schöne Antwort. Ich besuche nur mein C: Wenn Sie einen Zeiger in C ändern möchten, müssen Sie einen Zeiger an einen Zeiger übergeben. Wenn Sie einen Zeiger auf einen Zeiger ändern müssen, müssen Sie einen Zeiger auf einen Zeiger an einen Zeiger übergeben. Wieso den? Können wir also sagen, wenn wir einen Wert ändern wollen, müssen wir auch einen Zeiger auf diesen Wert übergeben? Bitte erläutern Sie mehr. Danke im Voraus.

    – Unheilig

    7. Januar 2014 um 21:37 Uhr

  • HI Unheilig, das hängt mit Call by Reference zusammen. Zum Beispiel (irgendein Typ) *A then Wenn ein Typ an einer anderen Stelle geändert werden muss als dort, wo A derzeit definiert ist, müssen Sie die Adresse von A übergeben und müssen die übergebene Adresse in der aufgerufenen Funktion dereferenzieren. Der Grund für die Adressübergabe ist, dass die aufgerufene Funktion ihren separaten Stack im Adressraum des Prozesses erhält. Im obigen Problem befindet sich A, das in main() definiert ist, in einem separaten Stapel und es wird nie von initialize() darauf zugegriffen. Es wird kein Fehler gemeldet, wenn in main() nicht auf A zugegriffen wird.

    – Vishal Sahu

    11. März 2016 um 16:45 Uhr

  • Vielen Dank, ich kämpfe seit 3 ​​Tagen damit.

    – Hari Kiran Vusirikala

    22. Juni 2017 um 13:28 Uhr

Wenn Sie einen Zeiger auf einen Zeiger ändern möchten, müssen Sie einen Zeiger auf einen Zeiger auf einen Zeiger übergeben.

void func(double ***data) { *data = malloc(sizeof(double*)*10); for.... };
double ** data; func(&data);

  • Ich besuche nur mein C: Wenn Sie einen Zeiger in C ändern möchten, müssen Sie einen Zeiger an einen Zeiger übergeben. Wenn Sie einen Zeiger auf einen Zeiger ändern müssen, müssen Sie einen Zeiger auf einen Zeiger an einen Zeiger übergeben. Wieso den? Können wir also sagen, wenn wir einen Wert ändern wollen, müssen wir auch einen Zeiger auf diesen Wert übergeben? Bitte erläutern Sie mehr. Danke im Voraus.

    – Unheilig

    7. Januar 2014 um 21:38 Uhr

  • Zusammenfassend lässt sich sagen, dass Sie, wenn Sie einen Wert innerhalb einer Funktion ändern möchten, den Zeiger auf diesen Wert an die Funktion übergeben müssen. Werte werden (immer) nur (nach Wert) in Funktionen kopiert. Beispiel/Referenz

    – j3141592653589793238

    3. März 2019 um 17:52 Uhr


Nun, zum einen, die A inside initialize ist eine Kopie der A in main – Also, wenn Sie zurückkommen maines ist A ist noch nicht initialisiert. Wenn Sie versuchen, es zu benutzen – Boom!

Um es weiterzugeben initialize ‘by reference’, müssen Sie den Parametertyp ändern in double*** und eintreten &A in main. Dann, wenn Sie es in verwenden initializemüssen Sie es jedes Mal dereferenzieren, dh *A.

  1. Sie suchen nicht nach Speichermangelfehlern. Scheitern.

  2. Sie übergeben BY VALUE einen nicht initialisierten Wert A an initialize() und initialisieren diesen dann. Aber zurück in main() ist diese lokale Variable A immer noch nicht initialisiert. Stattdessen könnten Sie initialize() die zurückgeben lassen double** (z.B A = initialize(...)) oder ändere initialize() so, dass sein erster formaler Parameter a ist double ***pA mit der Sie initialisieren *pA = (double**)malloc(...);

Benutzer-Avatar
Arsenal

Das ist die Art von Dingen, die Sie nicht tun möchten. Anstatt dafür unnötigerweise ein out-Argument zu verwenden, weisen Sie die Funktion zu und geben Sie das Ergebnis zurück. Tun Sie dies stattdessen:

int main() 
{
    double **A;
    A = initialize(A10, 10);
}

double** initialize(int r, int c)
{
   double **A;
   A = malloc(sizeof(double *)*r);
   for(int i = 0; i< r; i++) {
        A[i] = (double *)malloc(sizeof(double) *c);
        for(int j = 0; j < c; j++) {
            A[i][j] = 0.0;
        }
   }
  return A;
}

  • Sie haben vergessen, den Rückgabetyp von zu aktualisieren initializeund um tatsächlich einen Wert zurückzugeben.

    – Karl Knechtel

    2. Dezember 2010 um 20:14 Uhr

  • Sie haben vergessen, den Rückgabetyp von zu aktualisieren initializeund um tatsächlich einen Wert zurückzugeben.

    – Karl Knechtel

    2. Dezember 2010 um 20:14 Uhr

1136750cookie-checkC: Wie man einen Doppelzeiger an eine Funktion übergibt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy