Geben Sie einen Doppelzeiger frei

Lesezeit: 3 Minuten

Benutzer-Avatar
bledi

Ich habe eine 2-D-Matrix mit einem Doppelzeiger wie folgt erstellt:

int** pt; pt = (int*) malloc(sizeof(int)*10);

Ich weiß, dass ein Zeiger so befreit wird

free(ptr);

Wie können wir den Doppelzeiger befreien?

Was ist, wenn wir etwas drucken und später diesen Speicher freigeben und das Programm beenden? Besteht die endgültige Erinnerung aus der, die wir verwendet haben, oder wird sie dieselbe sein wie die anfängliche?

  • Das hängt davon ab, wie Sie angerufen haben malloc. Wo ist der Code?

    – Eitan T

    13. Juni 2012 um 13:00 Uhr

  • @bledi Sie müssen diese Zeiger also durchlaufen und zuerst die referenzierten Daten freigeben. Dann befreien Sie die Zeiger selbst. Sehen Sie sich Attilas Antwort an.

    – Eitan T

    13. Juni 2012 um 13:05 Uhr

  • Das Gleiche gilt für das Aufstellen des relevanten Malloc-Codes.

    – Krakengrabbus

    13. Juni 2012 um 13:06 Uhr

  • In C das Ergebnis eines Aufrufs nicht umwandeln malloc(), realloc()oder calloc() – es ist unnötig und verbirgt möglicherweise den schwerwiegenden Fehler eines fehlenden Prototyps.

    – mlp

    15. Juli 2019 um 15:57 Uhr

Benutzer-Avatar
Attila

Angenommen, Sie haben eine Matrix mat

int** mat = malloc(10 * sizeof(int*));
for (int i=0; i<10; ++i) {
  mat[i] = malloc(10 * sizeof(int));
}

dann können Sie jede Zeile der Matrix freigeben (vorausgesetzt, Sie haben sie vorher korrekt initialisiert):

for (int i=0; i<10; ++i) {
  free(mat[i]);
}

dann geben Sie den Top-Level-Zeiger frei:

free(mat);

Zu Ihrer zweiten Frage: Wenn Sie Speicher zuweisen und verwenden, ändern Sie diesen Speicher, der nicht “zurückgesetzt” wird, selbst wenn Sie ihn freigeben (obwohl Sie nicht mehr zuverlässig / portabel darauf zugreifen können).

Notiz: Malloc der obersten Ebene verwendet sizeof(int*) wie Sie Zeiger auf- zuweisenints, nicht ints – die Größe von int* und int sind nicht garantiert gleich.

Benutzer-Avatar
entspannen

Wenn Ihre Matrix nicht “ausgefranst” ist, dh alle Zeilen die gleiche Länge haben, sollten Sie Folgendes in Betracht ziehen:

  1. Greifen Sie manuell darauf zu, dh behandeln Sie es einfach als 1D-Array von Werten und behalten Sie ein separates width Wert. Um auf ein Element zuzugreifen bei (x, y) verwenden mat[y * width + x].
  2. Wenn Sie wirklich den Komfort von mat[y][x]können Sie es verbessern, indem Sie einen einzigen Aufruf an ausführen malloc() das zuordnet beide das Zeiger-Array und alle Zeilen, und initialisiert dann die Zeiger, um auf jede Zeile zu zeigen. Das hat den Vorteil, dass alles mit einem einzigen free:ed sein kann free(mat); Anruf.

Der zweite Ansatz würde in etwa so aussehen:

double ** matrix_new(size_t width, size_t height)
{
  double **p = malloc(height * sizeof *p + width * height * sizeof **p);
  double *e1 = (double *) (p + height);
  size_t i;

  for(i = 0; i < height; ++i)
    p[i] = e1 + i * width;
  return p;
}

Hinweis: Das Obige ist ungetestet, und der Produktionscode sollte vor der Verwendung offensichtlich auf Fehler überprüft werden p.

  • Wenn Sie nur den Zeiger der obersten Ebene freigeben, werden die Puffer, auf die die interne Ebene zeigt, nicht referenziert. Werden sie standardmäßig von einem Garbage Collector freigegeben????. oder sollten sie explizit freigegeben werden???

    Benutzer2948075

    3. September 2014 um 17:50 Uhr


  • Sofern ich das nicht missverstehe, weisen Sie sowohl einem Array Speicherplatz zu double *und ein 2D-Array von double von Größe width * height. Warum nicht malloc(height * sizeof(double *) + width * height * sizeof(double)? Das + width * height Ein Teil Ihres Malloc würde nur ein Byte pro zuweisen double in der Matrix, die nicht genug Platz ist.

    – Michael Dorst

    13. Oktober 2019 um 20:04 Uhr

  • @MichaelDorst Weil es ein Fehler war, jetzt behoben. Danke vielmals.

    – abschalten

    14. Oktober 2019 um 14:01 Uhr

  • Aber du hast die nicht gesetzt free() Satz; @MichaelDorst beziehst du dich darauf? len = sizeof(int *) * rows + sizeof(int) * columns * rows; und arr = (int **)malloc(len);. In diesem Fall wollte ich aber wissen, wie ich diesen Doppelzeiger befreien kann.

    – Vincent Thorpe

    1. Februar 2020 um 15:29 Uhr


  • @vincentthorpe Ich weiß nicht, was du fragst.

    – Michael Dorst

    1. Februar 2020 um 17:14 Uhr

1179480cookie-checkGeben Sie einen Doppelzeiger frei

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

Privacy policy