Ошибка на realloc: поврежденный размер по сравнению с prev_size - PullRequest
0 голосов
/ 01 ноября 2018

Я кодирую в C. Цель моего алгоритма - удвоить каждый символ c, который мы находим в массиве str. Я должен выполнить несколько тестов, для первого теста я называю doubleChar("~/fichier.txt", '~'), и он работает нормально, но мой второй тест - doubleChar("une commande # commentaire", '#'), и я получаю ошибку из названия. Когда я пытался его отладить, ошибка была в строке realloc.

В отладчике я получаю эту ошибку:

Программа Полученный сигнал SIGABRT Stack trace доступен на вкладке «Call Stack»

Есть идеи, почему?

Вот мой код:

    char * doubleChar(const char *str, char c){
assert(str!=NULL);
    char *newString=malloc(sizeof(str) * sizeof(char));
    int a = 0;
    while(str[a] != '\0'){
        newString[a]=str[a];
        a++;
    }
    newString[a]='\0';
    int i = 0;
    while(newString[i] != '\0'){
        if(newString[i] == c){
            newString = (char *)realloc(newString, stringLength(newString)*sizeof(char) + sizeof(char));
            for(int j=stringLength(newString)+1; j>i; j--){
                newString[j]=newString[j-1];
            }
            i++; //we add 1 to i so we don't find the char we just added
        }
        i++;
    }
    return newString;
}

1 Ответ

0 голосов
/ 01 ноября 2018
char *newString=malloc(sizeof(str) * sizeof(char));

Поскольку str - это const char *, sizeof(str) - это количество байтов, которое const char * занимает на вашей платформе. Это не то, что вы хотите. То, что вы хотите передать в malloc, это длина строки, которую вы хотите сохранить, оставив дополнительный байт для завершающего нуля. В данном случае это (strlen(str) + 1).

newString = (char *)realloc(newString, stringLength(newString)*sizeof(char) + sizeof(char));

Это, вероятно, также неправильно. Вам нужно (strlen(newString) + 2), чтобы оставить один байт для вновь добавленного символа и один байт для нулевого терминатора. Хотя трудно быть уверенным, потому что я не могу сказать, что делает ваша функция stringLength.

Также sizeof(char) по определению равен единице. Функция sizeof возвращает размер в символах.

Гораздо проще понять strlen(newString) + 2, чем stringLength(newString)*sizeof(char) + sizeof(char), потому что strlen - стандартная функция, а sizeof(char) - многословно и безобразно. Поэтому я настоятельно рекомендую изменить это значение на strlen(newString) + 2.

...