如何解决在特定大小后使用 realloc 失败
我是 C 新手,我正在尝试解决编码练习以进行练习。
在这个特定的方法中,我接收一个 char** s
作为参数,它总是包含 5 个字符串,我必须处理这些字符串并将其转换为一个,即方法的返回值。
鉴于无法知道最终字符串的长度,我的想法是在知道数组中每个特定字符串的长度后使用 realloc
。然而,即使它工作了几次,经过一些迭代(在我运行的测试用例中,例如它工作到 size = 43),它突然失败并显示 realloc(): invalid next size
。
我四处搜索,但无法弄清楚我做错了什么。你能帮我弄清楚吗?
char* process(char** s) {
size_t size = 0,last = 0;
char *result,*word,c;
char *temp = NULL;
result = malloc(1);
for (size_t i = 0; i < 5; i++)
{
word = s[i];
size += strlen(word);
temp = realloc(result,size + 1);
if (!temp){
printf("Failed Reallocating");
free(result);
exit(-1);
}
else result = temp;
for (size_t j = last; j < last + size; j++)
{
c = word[j - last];
result[j] = isalpha(c) ? change_char(c) : c;
}
last += strlen(word);
}
result[size] = '\0';
return result;
}
解决方法
您正在写入超过您(重新)分配的内存大小。
temp = realloc(result,size + 1);
表示您分配了 size+1 个字符。
但是在内部循环 for (size_t j = last; j < last + size; j++)
中,j 一直到 last+size-1 保证超过 size+ 1 然后你写 result[j] = isalpha(c) ? change_char(c) : c;
这样你就写过了你分配的内存,覆盖其他数据,包括元数据 realloc 用来跟踪分配的内容和内容免费。因此,下次您尝试重新分配时,它会因几乎随机的错误而失败。
然而,修复非常简单。迭代到您分配的新大小 for (size_t j = last; j < size; j++)
,它会按预期工作。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。