2012-04-07 7 views
0

Ich möchte die Größe des Arrays ändern, wenn es seine maximale Kapazität erreicht. Aber Fehler kam, nachdem ich ./a.out tun Bitte helfen Sie mir ...Fehler bei der Verwendung von realloc für ein Array, das read int aus der Datei speichert

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

Code:

#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; 
} 

Antwort

5

Sie haben arr++ in der Schleife Zustand. Das bedeutet, dass nicht mehr auf den Anfang des zugewiesenen Speichers zeigt, wenn Sie realloc() aufrufen. Das wird mit dem Fehler enden, den Sie sehen.

auch:

  1. Programmierung Sicherheitshinweis:

    Rufen Sie nicht realloc() in der Form:

    foo = realloc(foo, bar); 
    

    Wenn ein Fehler auftritt, wird foo-NULL und Sie eingestellt werden werde die ursprüngliche Zuteilung verlieren.

  2. Nonidiomatic Code Anmerkung:

    (cap +=1) * sizeof(int) 
    

    ist ein bisschen komisch. Warum nicht ++cap * sizeof(int)? Oder noch besser, machen Sie es auf zwei Zeilen, anstatt alles in einen zu stopfen.

+0

So ist die Lösung einen Zeiger verwenden zum arr zu zeigen und dann aus dem Zeiger rechts gelesen ? –

+0

Verlieren Sie nicht den Zeiger auf den Anfang Ihrer Zuweisung. Erstellen Sie eine Kopie und verwenden Sie diese, wenn Sie beispielsweise 'realloc()' aufrufen. –

+0

Ich habe folgendes getan: int * y = arr; while (fscanf (f, "% d", y ++)! = EOF) so jetzt habe ich einen neuen Zeiger tun die Arbeit, und arr ist nicht ändern Sie den ursprünglichen Speicherort. Aber stattdessen habe ich einen Segmentierungsfehler :( –

0

Sie müssen die realloc auf der gleichen Adresse ausführen erhielt Fromm malloc, aber Sie erhöhen arr in while(fscanf(f, "%d", arr++)!=EOF)

Verwandte Themen