【发布时间】: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
-
不应该为实现保留带前导下划线的标识符吗?