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



我有两个函数:
- stringCopy(),它将参数strToCopy复制到另一个动态分配的字符串中,应用消毒(参见第二个函数)
- _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]) != '') 
    {
        if ('A' <= evaluatedChar && evaluatedChar <= 'Z') 
        {
            uppercasedStr[i] = evaluatedChar;
            i++;
        }
        else if ('a' <= evaluatedChar && evaluatedChar <= 'z') 
        {
            uppercasedStr[i] = evaluatedChar-32;
            i++;
        }
        k++;
    }
    i++;
    uppercasedStr[i] = '';
    return uppercasedStr;
}

char* stringCopy(char* strToCopy)
{
    char* uppercaseStr = _sanitized(strToCopy);
    char* copiedStr = malloc(sizeof uppercaseStr);
    int k = 0;
    while (uppercaseStr[k] != '') 
    {
        copiedStr[k] = uppercaseStr[k];
        k++;
    }
    k++;
    copiedStr[k] = '';
    free(uppercaseStr);
    return copiedStr;
}

我还注意到,当我从uppercaseStr复制char到copiedStr时,它同时修改了uppercaseStr,导致溢出…

我看到的错误如下:

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,因此不需要它。

相关内容

  • 没有找到相关文章

最新更新