2012-04-07 48 views
0

我想在達到最大容量時調整數組的大小。但錯誤上來後,我做的./a.out請幫我...使用realloc存儲從文件中讀取int的數組時出錯

Error: a.out: malloc.c:3574: mremap_chunk: Assertion `((size + offset) & (mp_.pagesize-1)) == 0' failed. 

代碼:

#include<stdio.h> 
#include <stdlib.h> 


int main(void) 
{ 
    int cap=5; 
    int *arr = malloc(cap*sizeof(int)); 
    FILE *f; 

    if((f=fopen("/home/file.txt","r"))==NULL) 
    printf("You cannot open"); 

    while(fscanf(f, "%d", arr++)!=EOF) 
    { 
    index++; 
    if(index==cap-1) 
     arr = realloc(arr, (cap +=1) * sizeof(int)); 
    } 

    return 0; 
} 

回答

5

你有arr++在循環狀態。這意味着當您撥打realloc()時,arr不再指向已分配內存的開始位置。這將以你所看到的錯誤結束。

另外:

  1. 編程安全注意事項:

    不要調用形式realloc()

    foo = realloc(foo, bar); 
    

    如果發生錯誤,foo將被設置爲NULL和你將泄漏原始分配。

  2. Nonidiomatic代碼注:

    (cap +=1) * sizeof(int) 
    

    是有點怪。爲什麼不是++cap * sizeof(int)?或者更好的是,通過兩條線來完成,而不是將它們全部整合爲一個。

+0

因此該解決方案將使用指針指向的編曲,然後從指針向右讀增加arr ? – 2012-04-07 18:14:30

+0

只要不失去指向開始分配的指針。例如,在調用'realloc()'時創建一個副本並使用它。 – 2012-04-07 18:15:48

+0

我做了以下幾點: int * y = arr; while(fscanf(f,「%d」,y ++)!= EOF) 所以現在我有一個新的指針做工作,並且arr不會改變它的原始位置。但是我得到了一個分割錯誤:( – 2012-04-07 18:18:05

0

您需要在收到弗洛姆malloc相同的地址進行realloc,但你在while(fscanf(f, "%d", arr++)!=EOF)