动态C字符串(char *)奇怪的行为

时间:2011-11-18 10:10:55

标签: c string malloc

我有两个功能:
- stringCopy()将参数strToCopy复制到应用清理动态分配的另一个字符串中(参见第2功能)
- _sanitized()返回动态分配的大写参数版本并删除非字母char(例如数值和空格)。

考虑到以下情况,由于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;
}

我还注意到,当我将uppercaseStr中的字符复制到copiedStr时,它会在导致溢出的同一时间修改uppercaseStr ...

1 个答案:

答案 0 :(得分:6)

我看到的错误在于:

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-string的长度。

另请注意,我省略了sizeof(char)。这是因为sizeof(char)被定义为C中的1。因此不需要它。