Я пишу некоторые функции для строк, но у меня проблема с перераспределением - PullRequest
0 голосов
/ 25 мая 2020

Я пишу некоторые функции для строк, и у меня проблема с reallo c. Почему я получаю сообщение об ошибке realloc(): invalid pointer: 0x000...

Это моя структура строки:

typedef struct {
    int length;       /* Length of the String excluding '\0' */
    char * string;    /* pointer to string */
} string;

Это моя функция создания строки:

string string_create(char content[]) {
    string localString;
    localString.length = 0;
    while (content[localString.length] != '\0') {
        localString.length++;
    }
    localString.string = (char *)calloc((localString.length + 1), sizeof(char));
    localString.string = content;
    return localString;
}

Это моя строка функция вставки: (Функция с проблемами)

void string_insert(string * btstring, int index, char s[]) {        

    int stringLength = 0;
    while (s[stringLength] != '\0') {
        stringLength++;
    }

    if (stringLength > 0) {
        btstring -> length += stringLength;
        btstring -> string = (char *) realloc((btstring -> string), ((btstring -> length + 1) * sizeof(char)));


        for (int i = 0; i < stringLength; i++) {
            char c = s[i];
            char temp[2] = {0, c};
            int cindex = index + i;
            while (btstring -> string[cindex] != '\0') {
                temp[0] = btstring -> string[cindex];
                btstring -> string[cindex] = temp[1];
                temp[1] = temp[0];
                cindex++;
            }
            temp[0] = btstring -> string[cindex];
            btstring -> string[cindex] = temp[1];
            temp[1] = temp[0];
            cindex++;
            btstring -> string[cindex] = temp[1];
        }

    }

}

1 Ответ

0 голосов
/ 25 мая 2020

realloc может вернуть запрошенный объем памяти по другому адресу (и это может дать сбой). Следовательно, вам следует сделать:

    char *tmp;
    tmp = realloc(btstring->string, stringLength + 1);
    if (!tmp) return;                  // could not allocate the memory
    btstring->string = tmp;            // assign the (new) memory to the string.
    btstring->length = stringLength;   // only now update the length

Примечания:

  • realloc сохраняет данные исходной памяти, если ему необходимо выделить другой фрагмент памяти для удовлетворить ваш запрос.

  • не приводите возвращаемое значение семейства функций malloc. Указатель void совместим со всеми указателями.

  • размер символа всегда равен 1.

  • хотя это вопрос стиля, Обычно между структурой и членами не должно быть пробелов, как в a->b и c.d.


Другая ошибка - в функции создания:

localString.string = content;

Это назначит указатель на символ content указателю на символ localString.string, выбрасывая только что выделенную память. Вы должны сделать:

strcpy(localString.string, content);

Это копирует содержимое строки content в память localString.string.

...