Выделение памяти для массива строк - PullRequest
1 голос
/ 10 апреля 2019

Итак, я пытаюсь выделить память для вставки в нее имен файлов. У меня есть моя структура Estado, определенная так:

typedef struct estado{

    char modo;
    char jogador;
    char matriz[8][8];
    int pretas;
    int brancas;
    char *nome[10];
    int current;

} Estado;

Я пытался сделать это:

Estado insereFicheiro(Estado estado , char* nome){

    estado.nome[estado.current] = malloc(sizeof(char*));
    estado.nome[estado.current++] = nome;

    return estado;
}

Что я делаю не так?

1 Ответ

2 голосов
/ 10 апреля 2019

Есть две проблемы с кодом, который вы показываете:

  1. С

    estado.nome[estado.current] = malloc(sizeof(char*));
    

    Вы выделяете только пространство для указателя , а не всю строку. Это похоже на создание массива одного указателя. Вам нужно выделить место для самой строки, длину которой вы получите от strlen, а также для нулевого терминатора в конце:

    estado.nome[estado.current] = malloc(strlen(nome) + 1);  // +1 for null-terminator
    
  2. С

    estado.nome[estado.current++] = nome;
    

    вы перезаписываете указатель, который вы создали выше. Это эквивалентно, например, int a; a = 5; a = 10; и затем удивитесь, что a больше не равен 5. Вам нужно скопировать строку, а не указатель:

    strcpy(estado.nome[estado.current++], nome);
    

Конечно, вам нужно free памяти, которую вы позже выделите в своем коде, как только вы закончите с этим.

И, конечно, у вас должна быть некоторая проверка границ, чтобы убедиться, что вы не выходите за пределы массива estado.nome (то есть проверка для estado.current < 10).

...