Question

Je lis l'exemple sur « passage des tableaux multidimensionnels en C "sur ce site.

Il est un excellent exemple en utilisant des tableaux char, et j'ai appris beaucoup de lui. Je souhaite faire la même chose en créant une fonction pour gérer un tableau d'entiers à une dimension allouée dynamiquement, et après cela, créer une autre fonction de manipulation d'un tableau d'entiers multi-dimensionnelle. Je sais comment le faire en tant que valeur de retour à une fonction. Mais dans cette application que je dois faire sur la liste des arguments à la fonction.

Tout comme dans l'exemple I mentionné ci-dessus, je voudrais passer un pointeur vers un tableau d'entiers à une fonction, ainsi que le nombre d'éléments « num » (ou « ligne » et « colonne » pour une fonction de tableau 2D , etc.). Je suis une version retravaillée de l'autre exemple ici, mais je ne peux pas obtenir ce travail, essayez comme je pourrais (lignes de code qui sont nouveaux ou modifiés, de cet exemple, sont marqués). Est-ce que quelqu'un sait comment résoudre ce problème?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ELEMENTS 5
void make(char **array, int **arrayInt, int *array_size) { 
    int i;
    char *t = "Hello, World!";
    int s = 10; // new
    array = malloc(ELEMENTS * sizeof(char *));
    *arrayInt = malloc(ELEMENTS * sizeof(int *));  // new
    for (i = 0; i < ELEMENTS; ++i) {
        array[i] = malloc(strlen(t) + 1 * sizeof(char));
        array[i] = StrDup(t);
        arrayInt[i] = malloc( sizeof(int)); // new
        *arrayInt[i] = i * s; // new
    }
}
int main(int argc, char **argv) {
    char **array;
    int  *arrayInt1D; // new
    int size;
    int i;
    make(array, &arrayInt1D, &size); // mod
    for (i = 0; i < size; ++i) {
        printf("%s and %d\n", array[i], arrayInt1D[i]); // mod
    }
    return 0;
}
Était-ce utile?

La solution

Il y a beaucoup de problèmes dans ce code. Jetez un coup d'oeil à l'adresse suivante:

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

#define ELEMENTS 5

/*
 * A string is an array of characters, say char c[]. Since we will be creating
 * an array of those, that becomes char *(c[]). And since we want to store the
 * memory we allocate somewhere, we must be given a pointer. Hence char
 * **(c[]).
 *
 * An int doesn't require a complete array, just int i. An array of those is
 * int i[]. A pointer to those is then int *(i[]).
 */
void
make(char **(chars[]), int *(ints[]), size_t len)
{
    static char hw[] = "Hello, World!";
    size_t i = 0;

    /*
     * Allocate the memory required to store the addresses of len char arrays.
     * And allocate the memory required to store len ints.
     */
    *chars = malloc(len * sizeof(char *));
    *ints = malloc(len * sizeof(int));

    /* Fill each element in the array... */
    for (i = 0; i < ELEMENTS; i++) {
        /* ... with a *new copy* of "Hello world". strdup calls malloc under
         * the hood! */
        (*chars)[i] = strdup(hw);
        /* ...with a multiple of 10. */
        (*ints)[i] = i * 10;
    }
}

int
main(void)
{
    /* A string c is a character array, hence char c[] or equivalently char *c.
     * We want an array of those, hence char **c. */
    char **chars = NULL;
    /* An array of ints. */
    int *ints = NULL;
    size_t i = 0;

    /* Pass *the addresses* of the chars and ints arrays, so that they can be
     * initialized. */
    make(&chars, &ints, ELEMENTS);
    for (i = 0; i < ELEMENTS; ++i) {
        printf("%s and %d\n", chars[i], ints[i]);
        /* Don't forget to free the memory allocated by strdup. */
        free(chars[i]);
    }

    /* Free the arrays themselves. */
    free(ints);
    free(chars);

    return EXIT_SUCCESS;
}

Autres conseils

Vous manquez la taille d'une ligne ici:


arrayInt[i] = malloc( sizeof(int)); // new

devrait être quelque chose comme:


arrayInt[i] = malloc( row_len * sizeof(int)); // new

où avant que vous utilisiez une longueur de chaîne donnée comme la taille de ligne (également strlen(t)+1 devrait être entre parenthèses, même si l'effet est le même parce que sizeof(char) est 1)

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