c - 在一定大小后使用 realloc 失败
问题描述
我是 C 新手,我正在尝试解决编码练习。
在这个特定的方法中,我将 a 作为参数接收,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++)
它会按预期工作。
推荐阅读
- git - Git:如何在不区分大小写的文件系统上签出分支?Git 认为我在工作树中有未跟踪的文件,而我没有
- minecraft - 如何在我的世界 1.14 中使用命令块设置交易箱?
- prolog - 从包含的 prolog 文件访问谓词
- java - 如何遍历二叉树
- elasticsearch - 如何为一条数据中的值数量创建脚本字段?
- amazon-web-services - AWS sam 对远程资源的本地调用
- python - 有没有比 csv.DictReader 更好的方法来编译来自多个文件的列数据?
- jython - 将外部 Sikuli 类导入 1 个 Sikuli 脚本
- sql - 如何计算查询中的剩余值
- bash - 如何在使用 Plink 执行的 bash 文件中接受用户输入?