首页 > 解决方案 > 在一定大小后使用 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;    
}

标签: cexceptionmemorydynamicrealloc

解决方案


您正在写入超过您(重新)分配的内存大小。 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++)它会按预期工作。


推荐阅读