【问题标题】:Dynamic C string (char*) weird behavior动态 C 字符串 (char*) 奇怪的行为
【发布时间】:2011-11-18 10:10:54
【问题描述】:

我有 2 个功能:
- 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]) != '\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 导致溢出...

【问题讨论】:

  • 不应该 malloc(sizeof str)malloc(strlen(str)) 吗?
  • @Neel Basu 在这种情况下,使用 strlen(str) + 1
  • 大家跟着我重复一遍:sizeof != strlen
  • 不应该为实现保留带前导下划线的标识符吗?

标签: c string malloc


【解决方案1】:

我看到的错误在这里:

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)在C语言中被定义为1,所以不需要。

【讨论】:

  • 对。 sizeof str 为您提供指针的大小,而不是与字符串长度相关的任何内容。
猜你喜欢
  • 2017-01-11
  • 2017-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-10
  • 1970-01-01
相关资源
最近更新 更多