realloc给出错误 - 下一个大小无效

时间:2015-10-06 05:33:22

标签: c malloc realloc

#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的写入无效。有任何建议或见解吗?

1 个答案:

答案 0 :(得分:6)

&#34;无效的下一个尺寸&#34;使用动态内存分配时的错误消息样式通常是因为您通过写入已分配缓冲区的末尾来破坏内存区域。

看看你的两个分配线:

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

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

因此,当您第一次进行重新分配时,realloc_counter设置为20,因此您几乎肯定缩小分配的内存(尽管这取决于相对内容)当然,你的整数和字节的大小。)

例如,如果sizeof(int) == 4,则首先分配正确的40个字节,然后重新分配20个,当您需要的时间为80时。

应该做的事情是这样的:

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

顺便说一句,您应该同时检查mallocrealloc的返回值,看看它们是否失败。假设他们总能工作并不是一个好主意。