Почему я получаю «ошибка сегментации 11», когда мне выделено достаточно памяти? - PullRequest
0 голосов
/ 03 июня 2019

Я создал двойной указатель char, который будет использоваться как двумерный массив для хранения строк. Функция добавления предназначена для добавления строки, предоставленной в конец массива, указатель num_strings предназначен для отслеживания элементов в массиве (так как я не могу использовать sizeof). Кажется, что в какой-то момент функция не выделяет достаточно памяти, но я не могу понять, где и не могу найти другие проблемы.

Я уже пытался выделить как внешнему, так и внутреннему массиву большой объем памяти, гораздо больше, чем им нужно. Проблема сохраняется. Я также попытался скопировать строку в массив после запуска функции.

int main(int argc, char *argv[]) {
    char **strings = NULL;
    int num_strings = 0;

    append(&strings, &num_strings, "Alex");
    append(&strings, &num_strings, "Edward");

    // Do things with array

    for (int i = 0; i < num_strings; i++) {;
        printf("%s\n", strings[i]);
    }

    // Free memory after use

    for (int i = 0; i < num_strings; i++) {
        free(strings[i]);
    }

    free(strings);
    strings = NULL;

    return 0;
}

void append(char ***array, int * num_strings, char *string) {


    if (*array == NULL) {
        *array = malloc(sizeof(*array)); // start with enough room for 1 item (pointer)
    } else {
        // reallocate memory for new item
        *array = realloc(*array, (((*num_strings) + 1) * sizeof(*array)));

    }

    printf("Char Size: %lu\n", sizeof(char));
    printf("Given Size: %lu\n", sizeof(***(array)));

    *(array[*num_strings]) = malloc((strlen(string) + 1) * sizeof(***(array + 0)));

    strcpy(*(array[*num_strings]), string);

    (*num_strings)++; // increment the number of strings
}

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

1 Ответ

1 голос
/ 03 июня 2019

Проблема в том, что есть пара экземпляров *(array[*num_strings]), которые должны быть (*array)[*num_strings].

Разница в том, что первая форма пытается индексировать через указатель, переданный функции, как если бы переданный strings был массивом, разрушающим стек вызывающей стороны. Исправленная версия сначала разыменовывает указатель, а затем индексируется через цель по желанию.

Есть также несколько мест, где используется sizeof(*array), где должно быть sizeof(**array). x = malloc(sizeof(x)) никогда не бывает правильным. Но это не вызывает видимых проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...