gpt4 book ai didi

c - 错误从何而来? Valgrind/C/insertString

转载 作者:行者123 更新时间:2023-11-30 20:39:41 24 4
gpt4 key购买 nike

对于我的一个项目,我必须制作一个新版本的函数 insertString,您可以看到下面的代码:

这个函数总是给我想要的结果,(我做了一些单元测试),但是主要问题是这个:即使它在我的 IDE 中工作(编译等),它也不会通过使用 Valgrind 的单元测试,是有人能看到这个错误吗?

char * insertString(const char * src, int insertPosition, const char * toBeInserted,int insertLength)
{
size_t outputSize=stringLength(src)+(size_t)insertLength;
char* output=malloc(sizeof(char)*(outputSize+1));
int i;

if(output==NULL)
{
fatalError("error during memory allocation in InsertString");
}

for(i=0;i<insertPosition;i++)
{
output[i]=src[i];
}
for(i=0;i<insertLength;i++)
{
output[i+insertPosition]=toBeInserted[i];
}
for(i=0;i<=insertLength;i++)
{
output[i+insertPosition+insertLength]=src[insertPosition+i];
}

output[outputSize]='\0';
return output;

}

感谢所做的一切,祝周日愉快!

最佳答案

终止条件,i<=insertLength ,在最后一个循环中:

for(i=0;i<=insertLength;i++)
{
output[i+insertPosition+insertLength]=src[insertPosition+i];
}

src 中剩余的长度无关。如果insertLength足够大,代码将读取到 src 末尾之后.

将其更改为类似的内容(我认为):

for(i=0;i<=strlen(src)-insertPosition;i++)
{
output[i+insertPosition+insertLength]=src[insertPosition+i];
}

此外,在我看来,通过使用 output 的运行索引可以使代码更容易理解(因此可验证)。缓冲区而不是将其重置为 0对于每个循环并为下标添加其他值。或者,我认为使用指针遍历各种缓冲区会更具可读性:

char* tmp = output;

for(i=0;i<insertPosition;i++)
{
*tmp++ = *src++;
}
for(i=0;i<insertLength;i++)
{
*tmp++ = *toBeInserted++;
}
for(i=insertPosition;i<=strlen(src);i++)
{
*tmp++ = *src++;
}

*tmp++ = '\0';

关于c - 错误从何而来? Valgrind/C/insertString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26323925/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com