【发布时间】:2021-09-15 03:12:31
【问题描述】:
我是 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;
}
【问题讨论】:
-
j < last + size是错误的。last是正在构建的结果中的一个位置,size是result缓冲区的当前总大小,不包括终止空字符的空间。last + size超出缓冲区的末尾。将来,请始终在调试请求中包含minimal reproducible example。
标签: c exception memory dynamic realloc