【问题标题】:Using realloc with fails after certain size在一定大小后使用 realloc 失败
【发布时间】: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 &lt; last + size 是错误的。 last 是正在构建的结果中的一个位置,sizeresult 缓冲区的当前总大小,不包括终止空字符的空间。 last + size 超出缓冲区的末尾。将来,请始终在调试请求中包含minimal reproducible example

标签: c exception memory dynamic realloc


【解决方案1】:

您正在写入超出您(重新)分配的内存大小。 temp = realloc(result, size + 1); 表示您分配了 size+1 个字符。

但在内部循环for (size_t j = last; j &lt; last + size; j++) j 一直到 last+size-1 保证超过 size+1 然后你写result[j] = isalpha(c) ? change_char(c) : c;,这样你就写过了你分配的内存,覆盖了其他数据,包括元数据realloc用来跟踪什么是分配的,什么是空闲的。因此,下次您尝试重新分配时,它将失败并出现几乎随机的错误。


不过,修复非常简单。迭代到您分配的新大小for (size_t j = last; j &lt; size; j++),它会按预期工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-09
    • 2011-06-22
    • 2016-08-22
    • 2020-01-12
    相关资源
    最近更新 更多