2015-10-06 34 views
0
#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的無效寫。任何建議或見解?realloc發出錯誤 - 無效的下一個尺寸

回答

5

使用動態內存分配時,錯誤消息的「無效的下一個大小」樣式通常是因爲通過寫入超出分配的緩衝區末尾而損壞了內存區域。

看一看你的兩個分配線:

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

首先是乘以元素大小,元素數量,使得分配字節的號碼是正確的。第二種方法是單獨使用個數,而不用乘以元素大小。

所以你做了重新分配的第一次,realloc_counter設置爲20,所以你幾乎肯定會收縮分配的內存(雖然這當然取決於你的整數和字節的相對大小,) 。

例如,如果sizeof(int) == 4,你首先分配正確的40個字節,然後分配給二十歲,當你需要八十歲。

什麼你應該做的是一樣的東西:

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

順便說一句,你應該來檢查來自mallocrealloc返回值,看看他們是否失敗。假設他們會一直工作並不是一個好主意。

+0

非常感謝。一讀到你解釋的部分,「第一部分是將元素數乘以元素大小,以便分配的字節數是正確的;第二部分是單獨使用元素數而不用元素大小「。我進去了,改了我的代碼,它的工作,我回來看看你的答案的其餘部分,我看到你做了同樣的事情。我想我只是忽略了我的類型。 – Michealf

相關問題