Domanda

ho letto l'esempio a " Passando array multidimensionali in C "su questo sito.

E 'un grande esempio utilizzando gli array char, e ho imparato molto da esso. Vorrei fare la stessa cosa creando una funzione per gestire una allocato dinamicamente matrice integer unidimensionale, dopodiché, creare un'altra funzione per la gestione di una matrice integer multidimensionale. Io so come farlo come valore di ritorno a una funzione. Ma in questa applicazione ho bisogno di farlo sulla lista argomento della funzione.

Proprio come nell'esempio che ho citato sopra, desidero passare un puntatore a una matrice integer a una funzione, insieme al numero di elementi "num" (o "riga" e "col" per una funzione di matrice 2D , eccetera.). Ho una versione rielaborata dell'altro ad esempio qui, ma non riesco a far funzionare tutto questo, per quanto ci provi (righe di codice che sono nuovi, o modificati, da quel esempio, sono segnalati). Qualcuno sa come risolvere questo?

#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;
}
È stato utile?

Soluzione

Ci sono un sacco di problemi in quel codice. Date un'occhiata al seguente:

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

Altri suggerimenti

Ti manca dimensioni di una fila qui:


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

dovrebbe essere qualcosa di simile:


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

dove prima si utilizzava lunghezza della stringa data come la dimensione di riga (anche strlen(t)+1 dovrebbe essere tra parentesi, anche se l'effetto è lo stesso perché sizeof(char) è 1)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top