Вопрос

В настоящее время я пытаюсь выучить C и столкнулся с проблемой, которую не смог решить.

Рассмотреть:

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

Я понятия не имею, почему вышеописанному не удается прочитать содержимое массива после его создания.Я буквально потратил час, пытаясь понять, почему это не удается, но пришел с пустыми руками.Без сомнения, это что-то тривиальное.

Ваше здоровье,

Это было полезно?

Решение

Вот рабочий код:

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

Как опубликовали другие - был неиспользуемый размер, и strdup выделяет память сам по себе, и после этого приятно освободить память...

Другие советы

Вам нужно передать адрес "массива" в функцию.То есть вам нужен символ ***.Это связано с тем, что вам нужно изменить значение array, выделив для него память.

Редактировать:Просто чтобы сделать его более полным, в объявлении функции вам нужно иметь что-то вроде

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

Затем вам нужно вызвать его, используя

make(&array, &size);

Внутри функции сделать, выделять память с

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

И соответствующим образом измените другие места.

Кроме того, как указал кауппи, strdup выделит для вас память, поэтому вам не нужно выполнять malloc для каждой строки.

Смотрите комментарий PolyThinker, который абсолютно точен.

В дополнение к способу передачи массива, вам следует проверить несколько других проблем:

  1. Возможно, вам следует присвоить что-то array_size в make(...)?
  2. strdup(char*) выделяет память, malloc для массива[i] не требуется.
  3. Вы должны освободить всю выделяемую вами память после того, как она вам больше не понадобится.

Вы проходите мимо текущий значение массива для создания копии (в стеке).когда вы изменяете массив в make(), вы изменяете только копию, а не саму переменную.Попробуйте передать по ссылке с помощью & или сделайте это символом *** и работайте с * array = ...

размер объявлен, но не получает присвоенного значения (я полагаю, это должно произойти в функции make).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top