此功能似乎存在问题:
void CatString(const char* srcStr, char** destStr, size_t* destCap) {
size_t destLen = strlen(*destStr);
unsigned int posDest = destLen;
int posSrc = 0;
while(srcStr[posSrc] != '\0') {
if( (destLen + 1) > *destCap )
DoubleString(destStr, destCap);
(*destStr)[posDest] = srcStr[posSrc];
posDest++;
posSrc++;
destLen++;
}
}
该函数应该将源字符串连接到目标字符串。如果目标字符串不够大,则使用DoubleString()
将其大小加倍。
假设srcStr
为Circles identical, overlap:
且destStr
为空。
调试,我发现在迭代21(posSrc == 22
)srcStr
是Circles identical, over
。在下一次迭代中出现问题:
(*destStr)[posDest] = srcStr[posSrc];
会出现意外情况 -
srcStr
从Circles identical, over
更改为Circles identical, overlerlap:
。下一步按预期工作,字符串变为Circles identical, overlarlap:
,依此类推,直到字符串变为Circles identical, overlap: p:
。因此,在没有意外迭代22的情况下,程序正常运行。我之前的用法也没有出现任何错误迹象。
那么是什么让步骤22中的作业复制了多个字符?
更多上下文here的代码。
编辑:空终止我的结果实际上似乎解决了问题,现在正确编程assert
并且valgrind
也得到满足。
答案 0 :(得分:1)
如果* destStr是malloc-ed:
int CatString(const char* srcStr, char** destStr)
{
int result = 0;
char * tmp = malloc(sizeof(char) * (strlen(*destStr) + strlen(srcStr) + 1));
if (tmp == NULL) result = -1;
if (!result)
{
strcpy(tmp, destStr);
strcat(tmp, srcStr);
free(*destStr);
*destStr = tmp;
}
return result;
}
或
int CatString(const char* srcStr, char** destStr, size_t destCap)
{
int result = 0;
size_t newStrlen = strlen(*destStr) + strlen(srcStr);
newStrlen = newStrlen > destCap ? destCap : newStrlen;
char * tmp = malloc(newStrlen + 1);
if (tmp == NULL) result = -1;
if (!result)
{
strcpy(tmp, *destStr);
strncat(tmp, srcStr, newStrlen - strlen(*destStr));
tmp[newStrlen] = '\0';
free(*destStr);
*destStr = tmp;
}
return result;
}