在一定大小后使用 realloc with 失败
Using realloc with fails after certain size
我是 C 的新手,我正在尝试解决一个编码练习。
在这个特定的方法中,我收到一个 char** s
作为参数,它总是包含 5 个字符串,我必须处理这些字符串并将其转换为一个,即方法的 return 值。
鉴于无法知道最终字符串的长度,我的想法是在知道数组中每个特定字符串的长度后使用 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] = '[=10=]';
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++)
,一切都会按预期工作。
我是 C 的新手,我正在尝试解决一个编码练习。
在这个特定的方法中,我收到一个 char** s
作为参数,它总是包含 5 个字符串,我必须处理这些字符串并将其转换为一个,即方法的 return 值。
鉴于无法知道最终字符串的长度,我的想法是在知道数组中每个特定字符串的长度后使用 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] = '[=10=]';
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++)
,一切都会按预期工作。