Pregunta

Actualmente estoy intentando aprender C y he llegado a un problema que no he podido resolver.

Considera:

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

No tengo idea de por qué lo anterior no puede leer el contenido de la matriz después de crearla. Literalmente, he pasado una hora tratando de entender por qué falla, pero he llegado con las manos vacías. Sin duda es algo trivial.

Saludos,

¿Fue útil?

Solución

Aquí está el código de trabajo:

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

Como los otros han publicado, hubo un tamaño no utilizado, y strdup asigna memoria por sí mismo, y es bueno liberar la memoria después ...

Otros consejos

Debe pasar la dirección de " matriz " en la función. Es decir, necesitas char ***. Esto se debe a que necesita cambiar el valor de la matriz, asignándole memoria.

EDITAR: Solo para hacerlo más completo, en la declaración de función necesita tener algo como

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

Entonces necesitas llamarlo usando

make(&array, &size);

Dentro de la función make , asigne memoria con

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

Y cambiar otros lugares en consecuencia.

Además, como ha señalado kauppi, strdup asignará memoria para ti, por lo que no necesitas hacer malloc en cada cadena.

Vea el comentario de PolyThinker que es absolutamente perfecto.

Además de la forma en que pasa la matriz, debe verificar algunos otros problemas:

  1. ¿Quizás deberías asignar algo a array_size en make (...)?
  2. strdup (char *) asigna memoria, el malloc para la matriz [i] no es necesario.
  3. Debería liberar toda la memoria que asigne después de que ya no la necesite.

Estás pasando el valor actual de la matriz para hacer una copia (en la pila). cuando cambia la matriz en make (), solo está cambiando la copia, no la variable real. Intente pasar por referencia con & amp ;, o conviértalo en un char *** y trabaje con * array = ...

se declara el tamaño pero no se asigna ningún valor (eso debería suceder en la función make, supongo).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top