2013-07-16 2 views
0

Mon programme C plante et je suis trop nouveau pour le comprendre. C'est très simple jusqu'ici et j'imagine que le code est suffisant pour comprendre ce qui ne va pas. J'essaie simplement de lire un fichier ligne par ligne. Je vais doubler la mémoire d'une structure une fois que je suis hors de la mémoire. Si ce n'est pas assez d'informations, je donnerai tout ce dont vous avez besoin.structure realloc avec fonction dans C

Merci beaucoup pour votre aide, car je suis coincé depuis des heures.

/* 
John Maynard 
1000916794 
7/15/2013 
HW-06 
*/ 

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

#define N 100 

struct course 
{ 
    char subject[11]; 
    int catalogNum; 
    int sectionNum; 
    int enrollmentTotal; 
    int enrollmentCap; 
}; 

void readFile(struct course *d, char* filename); 

void double_array_size(struct course *d, int new_size); 

int main(void) 
{ 
    char *filename = "hw06-data.csv"; 
    struct course *d; 

    d = malloc(N * sizeof(struct course)); 

    readFile(d, filename); 

} 


void readFile(struct course *d, char* filename) 
{ 
    FILE* fp; 
    char buffer[100]; 
    int i = 0, array_size = 100; 
    struct course *temp; 


    if((fp = fopen(filename, "r")) == NULL) 
    { 
     printf("Unabale to open %s.\n", filename); 
     exit(1); 
    } 

    fgets(buffer, sizeof(buffer), fp); 

    while(fgets(buffer, sizeof(buffer), fp) != NULL) 
    { 
     if (i == array_size) 
     { 
     array_size *= 2; 
     double_array_size(d, array_size); 
     printf("reached limit...increasing array to %d structures\n", array_size); 
     } 



     i++; 
    } 
    fclose(fp); 
} 

void double_array_size(struct course *d, int new_size) 
{ 
    struct course *temp; 

    temp = realloc(d, new_size * sizeof(struct course)); 

    if(temp == NULL) 
    { 
     printf("unable to reallocate\n"); 
     exit(1); 
    } 

    else 
     d = temp; 
} 

Répondre

2

realloc() peut retourner un pointeur différent de l'original un mais vous assignons à temp uniquement la fonction d'appel fonctionne toujours avec le pointeur d'origine après. Changer double_array_size() pour retourner le nouveau pointeur retourné par realloc() et appelez

d = double_array_size(d, array_size); 

En outre, vous devriez toujours vérifier le résultat fo malloc(), realloc() etc. Ils peuvent retourner NULL s'il n'y a pas plus de mémoire disponible

0

Realloc réaffecte mémoire , donc probablement la mémoire pointée par d sera libéré, a donc double_array_size modifier d, vous pouvez essayer:

void double_array_size(struct course** d, int new_size){ 
*d = realloc(*d, new_size * sizeof(struct course)); 
. 
. 
. 
} 
+2

Dans ce cas, il devrait être 'cours struct ** de d' et' * d = realloc (* d, ...) ' –

+0

vous avez raison, j'ai écrit C++, désolé –

0

la combinaison Ingo les réponses de son et codroipo, vous devez e ither retourner le nouveau pointeur de double_array_size, ou vous devez passer un pointeur vers d de sorte que vous pouvez mettre à jour le pointeur de double_array_size