在一定大小后使用 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++),一切都会按预期工作。