Pergunta

Atualmente, estou tentando aprender C e eu vim para um problema que eu fui incapaz de resolver.

Considere o seguinte:

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

Eu não tenho idéia por que o acima falhar voltar a ler o conteúdo da matriz após criá-la. Tenho literalmente passou uma hora tentando entender por que ele falhar, mas vieram acima de mãos vazias. Sem dúvida que é algo trivial.

Cheers,

Foi útil?

Solução

Aqui está o código de trabalho:

#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 o outro colocaram - havia tamanho não utilizado, e memória aloca strdup por si só, e é bom para liberar a memória depois ...

Outras dicas

Você precisa passar o endereço de "array" para a função. Ou seja, você precisa de carbonizar ***. Isso é porque você precisa alterar o valor da matriz, através da atribuição de memória para ele.

EDIT: Apenas para torná-lo mais completo, na declaração da função você precisa ter algo como

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

Em seguida, você precisa chamá-lo usando

make(&array, &size);

Dentro da função make , alocar memória com

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

e altere outros lugares em conformidade.

Além disso, como Kauppi fora pontas, strdup irá alocar memória para você, para que você não precisa fazer malloc em cada corda.

comentário Ver de PolyThinker que é absolutamente local.

Além da maneira que você passar a matriz, você deve verificar algumas outras questões:

  1. Talvez você deve atribuir algo a ARRAY_SIZE em make (...)?
  2. strdup (char *) atribui memória, o malloc para matriz [i] não é necessário.
  3. Você deve libertar toda a memória que você alocar depois você não é mais necessário.

Você está passando o atual valor da matriz para fazer como uma cópia (na pilha). quando você mudar de matriz no make (), você está mudando apenas a cópia, não a variável real. Tente passar por referência com &, ou torná-lo um char *** e trabalhar com array * = ...

tamanho é declarada, mas não recebe nenhum valor atribuído (que deve acontecer em função de marca, suponho).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top