我有两个函数:
- 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,因此不需要它。