Динамическая строка C (char *) странное поведение - PullRequest
1 голос
/ 18 ноября 2011

Я получил 2 функции:- stringCopy(), который копирует параметр strToCopy в другую строку, динамически размещаемую с применением функции sanitize (см. 2-ю функцию)- _sanitized(), который возвращает динамически размещенную версию параметра в верхнем регистре и удаляет не-буквенные символы (например, числовые значения и пробелы).

Учитывая следующее, я получил EXC_BAD_ACCESS из-за kслишком много.

char* _sanitized(const char* str)
{
    char* uppercasedStr = malloc(sizeof str);

    int k = 0; // Index de parcours de la chaîne originale
    int i = k; // Index dans la nouvelle chaîne
    char evaluatedChar;
    while ( (evaluatedChar = str[k]) != '\0') 
    {
        if ('A' <= evaluatedChar && evaluatedChar <= 'Z') 
        {
            uppercasedStr[i] = evaluatedChar;
            i++;
        }
        else if ('a' <= evaluatedChar && evaluatedChar <= 'z') 
        {
            uppercasedStr[i] = evaluatedChar-32;
            i++;
        }

        k++;
    }
    i++;
    uppercasedStr[i] = '\0';

    return uppercasedStr;
}


char* stringCopy(char* strToCopy)
{
    char* uppercaseStr = _sanitized(strToCopy);

    char* copiedStr = malloc(sizeof uppercaseStr);

    int k = 0;
    while (uppercaseStr[k] != '\0') 
    {
        copiedStr[k] = uppercaseStr[k];
        k++;
    }
    k++;
    copiedStr[k] = '\0';

    free(uppercaseStr);

    return copiedStr;
}

Я также заметил, что когда я копирую char из uppercaseStr в copiedStr, он одновременно изменяет uppercaseStr, что вызывает переполнение ...

1 Ответ

6 голосов
/ 18 ноября 2011

Ошибка, которую я вижу здесь:

char* uppercasedStr = malloc(sizeof str);

Вы не можете использовать sizeof(), чтобы получить длину строки.Вам нужно использовать strlen():

char* uppercasedStr = malloc(strlen(str) + 1);  //  Need +1 for terminating null

Вот еще одна и та же ошибка:

char* copiedStr = malloc(sizeof uppercaseStr);

должно быть:

char* copiedStr = malloc(strlen(uppercaseStr) + 1);

sizeof(str) дает вам только размер char указателя, а не длину всей c-строки.

Также обратите внимание, что я пропустил sizeof(char).Это потому, что sizeof(char) определено как 1 в C. Поэтому это не нужно.

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