【问题标题】:realloc is giving error - invalid next sizerealloc 给出错误 - 下一个大小无效
【发布时间】:2016-01-02 22:09:57
【问题描述】:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int temp;


int main()
{
    FILE * fp;
    fp = fopen("input2.txt", "r");                      //Open the input
    int counter = 0; 
    int realloc_counter = 10; 

    int *line_array;                                    //Initialize the array
    line_array = malloc(10 * sizeof(int));              //Allocate memory for initial ten numbers, of size int for each 

    while (fscanf(fp, "%d", &temp) > 0)
    {
        line_array[counter] = temp; 
        counter ++;

        if (counter % 10 == 0)
        {       
            realloc_counter = realloc_counter * 2;
            line_array = realloc(line_array, realloc_counter);
        }


    }



    fclose(fp);                                         //Close the input file
    free(line_array);                                   //Free the memory 

上面的代码就是我所拥有的。它一直给我一个错误,我似乎无法弄清楚。使用 valgrind 它说存在大小为 4 的无效写入。有什么建议或见解吗?

【问题讨论】:

    标签: c malloc realloc


    【解决方案1】:

    使用动态内存分配时出现“invalid next size”错误消息样式通常是因为您通过写入超出已分配缓冲区的末尾而损坏了内存区域。

    看看你的两条分配线:

    line_array = malloc(10 * sizeof(int));
    line_array = realloc(line_array, realloc_counter);
    

    第一个是将元素计数乘以元素大小,以便分配的字节数是正确的。第二种是单独使用元素count,而不用乘以元素大小。

    所以当你第一次重新分配时,realloc_counter 设置为 20,所以你几乎肯定会缩小分配的内存(尽管这取决于你的整数的相对大小当然还有字节)。

    例如,如果sizeof(int) == 4,您首先分配正确的四十个字节,然后重新分配二十个,当您需要是八十个时。

    应该做的事情是这样的:

    line_array = realloc(line_array, realloc_counter * sizeof(int));
    

    顺便说一句,您应该检查来自mallocrealloc 的返回值,看看它们是否失败。假设它们总是有效并不是一个好主意。

    【讨论】:

    • 非常感谢。一旦我阅读了您解释的部分“第一个是将元素计数乘以元素大小,以便分配的字节数是正确的。第二个只是单独使用元素计数而不将其乘以元素大小。”我进去了,更改了我的代码,它起作用了,我回来阅读了你的其余答案,我看到你做了同样的事情。我想我只是忽略了我的类型。
    猜你喜欢
    • 1970-01-01
    • 2015-04-12
    • 2020-12-27
    • 2014-10-13
    • 2015-01-22
    • 1970-01-01
    • 2019-07-24
    相关资源
    最近更新 更多