Frage

Ich bin derzeit versucht, C zu lernen, und ich habe zu einem Problem kommen, dass ich nicht in der Lage gewesen bin zu lösen.

Bedenken Sie:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ELEMENTS 5

void make(char **array, int *array_size) {
    int i;
    char *t = "Hello, World!";

    array = malloc(ELEMENTS * sizeof(char *));

    for (i = 0; i < ELEMENTS; ++i) {
        array[i] = malloc(strlen(t) + 1 * sizeof(char));
        array[i] = strdup(t);
    }
}

int main(int argc, char **argv) {
    char **array;
    int size;
    int i;

    make(array, &size);

    for (i = 0; i < size; ++i) {
        printf("%s\n", array[i]);
    }

    return 0;
}

Ich habe keine Ahnung, warum die oben nach dem Erstellen sie den Inhalt des Arrays lesen wieder ausfällt. Ich habe buchstäblich eine Stunde versucht zu verstehen, warum es nicht ausgegeben sondern kam mit leeren Händen. Kein Zweifel, es ist etwas trivial.

Cheers,

War es hilfreich?

Lösung

Hier ist der Arbeits Code:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ELEMENTS 5

void make(char ***array) {
    char *t = "Hello, World!";

    *array = malloc(ELEMENTS * sizeof(char *));

    int i;
    for (i = 0; i < ELEMENTS; ++i) {
        (*array)[i] = strdup(t);
    }
}

int main(int argc, char **argv) {
    char **array;
    make(&array);

    int i;
    for (i = 0; i < ELEMENTS; ++i) {
        printf("%s\n", array[i]);
        free(array[i]);
    }
    free(array);
    return 0;
}

Wie die anderen geschrieben haben - es gab nicht verwendete Größe und strdup reserviert Speicher von selbst, und es ist schön, die Erinnerung danach zu befreien ...

Andere Tipps

Sie müssen die Adresse von „Matrix“ in die Funktion zu übergeben. Das heißt, Sie müssen char ***. Dies liegt daran, Sie den Wert des Arrays ändern müssen, um Speicher zu verteilenden.

EDIT: Nur um es zu vervollständigen, in der Funktionsdeklaration müssen Sie so etwas wie

haben
void make(char ***array, int *array_size)

Dann müssen Sie es nennen mit

make(&array, &size);

Innerhalb der Funktion machen , weisen Speicher mit

*array = malloc(ELEMENTS * sizeof(char *));

Und andere Orte ändern sich entsprechend.

Auch als Kauppi ausgeführt hat, wird strdup Speicher für Sie zuweisen, so dass Sie malloc nicht auf jeder Saite müssen tun.

Siehe PolyThinker Kommentar, die unbedingt einge beschmutzen.

Neben der Art und Weise Sie das Array übergeben, sollten Sie ein paar andere Fragen überprüfen:

  1. Vielleicht sollten Sie zuweisen etwas machen, um ARRAY_SIZE (...)?
  2. strdup (char *) reserviert Speicher, die malloc für array [i] ist nicht erforderlich.
  3. Sie sollten alle frei den Speicher, den Sie zuweisen, nachdem Sie es nicht mehr benötigen.

Sie passieren die Strom Wert von Array als Kopie zu machen (auf dem Stack). wenn Sie Array in make () ändern, Sie ändern nur die Kopie, nicht die tatsächliche Variable. Versuchen Sie durch Bezugnahme vorbei mit &, oder macht es zu einem Zeichen *** und die Arbeit mit * array = ...

Größe deklariert, aber bekommt zugewiesen kein Wert (das in Funktion geschehen soll, nehme ich an).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top