Question

J'essaie actuellement d'apprendre le langage C et je suis parvenu à un problème que je n'ai pas pu résoudre.

Considérez:

#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;
}

Je ne sais pas pourquoi ce qui précède n'a pas réussi à relire le contenu du tableau après l'avoir créé. J'ai littéralement passé une heure à essayer de comprendre pourquoi cela échoue mais je suis revenu les mains vides. C'est sans doute quelque chose d'anodin.

A bientôt,

Était-ce utile?

La solution

Voici le code de travail:

#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;
}

Comme les autres l’ont signalé - la taille était inutilisée, et strdup alloue de la mémoire par lui-même, et il est agréable de libérer de la mémoire par la suite ...

Autres conseils

Vous devez transmettre l'adresse de "tableau". dans la fonction. C'est-à-dire que vous avez besoin d'omble chevalier En effet, vous devez modifier la valeur de array en y allouant de la mémoire.

EDIT: Juste pour compléter, dans la déclaration de fonction, vous devez avoir quelque chose comme

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

Ensuite, vous devez l'appeler en utilisant

make(&array, &size);

Dans la fonction make , allouez de la mémoire avec

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

Et changez d’autres endroits en conséquence.

En outre, comme l'a souligné kauppi, strdup allouera de la mémoire pour vous. Vous n'avez donc pas besoin de faire malloc sur chaque chaîne.

Voir le commentaire de PolyThinker qui est absolument parfait.

En plus de la façon dont vous passez le tableau, vous devriez vérifier quelques autres problèmes:

  1. Peut-être devriez-vous affecter quelque chose à array_size dans make (...)?
  2. strdup (char *) alloue de la mémoire, le malloc du tableau [i] n’est pas nécessaire.
  3. Vous devriez libérer toute la mémoire que vous allouez une fois que vous n'en avez plus besoin.

Vous transmettez la valeur actuelle du tableau à effectuer en tant que copie (sur la pile). lorsque vous modifiez un tableau dans make (), vous ne modifiez que la copie, pas la variable réelle. Essayez de passer par référence avec & amp; ou faites-en un caractère *** et travaillez avec * array = ...

la taille est déclarée mais aucune valeur n’est attribuée (cela devrait se produire dans la fonction make, je suppose).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top