2017-01-20 1 views
4
int main() { 
    struct lottery *array;  

    array = (struct lottery *)malloc(3000 * sizeof(struct lottery));  
    int opt, counter; 

    menu1(); 
    scanf("%d", &opt); 
    if (opt == 1) 
     Load(array, &counter); 
    else 
     exit("0"); 
    menu2(); 
    counter--; 
    scanf("%d", &opt); 
    while (opt != 7) { 
     switch (opt) { 
     case 1: 
      Save(array); 
      break; 
     case 2: 
      Enterd(array, &counter); 
      printf("%d\n", counter); 
      break; 
     } 
     menu2(); 
     scanf("%d", &opt); 
    } 
    return 0; 
} 

void Enterd(struct lottery *a, int *count) { 
    struct lottery *b; 
    int x; 

    (*count)++; 
    x = *count; 

    printf("Your new data will have an ID of %d\n",x); 
    a[x].aa = x; 

    b = (struct lottery *)realloc(a, x * sizeof(struct lottery)); 
    if (b == NULL) { 
     printf("Memory could not be allocated for your new input.Program will now exit...\n"); 
     exit("0"); 
    } 

    a = b; 

    printf("What is the date of your new draw?\n"); 
    scanf("%d/%d/%d", &a[x].date1.day, &a[x].date1.month, &a[x].date1.year); 
    printf("Now please insert the 5 non-joker numbers\n"); 
    scanf("%d%d%d%d%d", &a[x].n1, &a[x].n2, &a[x].n3, &a[x].n4, &a[x].n5); 
    printf("What is the 'Joker' number of this draw?\n"); 
    scanf("%d", &a[x].joker); 
    printf("Your input is now complete."); 
} 

J'écris une protection sur certains fichiers de loterie. J'ai ce problème dans ma fonction qui ajoute plus de données au tableau de loterie. Chaque fois que x contient 1989, mon appel realloc renvoie NULL. J'ai mis x pour être 1985 et i pourrait ajouter 4 entrées supplémentaires au tableau, mais chaque fois que x est 1989, il renvoie toujours NULL. Ma question est la suivante: y a-t-il quelque chose qui ne va pas dans le code ou je manque encore de mémoire?Realloc retournant NULL

+5

Nous avons besoin de voir un peu plus de code; pourriez-vous coller un 'principal' montrant comment cette fonction est appelée? – Bathsheba

+2

Vous n'avez pas besoin de lancer 'malloc/realloc' –

+1

Et veuillez formater votre code correctement. –

Répondre

0

Deux erreurs importantes:

C indexation de tableau commence à zéro, donc une fois que vous réallouer à x * sizeof(thing), seuls éléments à zéro x-1 sont valides. L'accès à l'élément x entraînera le chaos.

En second lieu, a = b modifie la copie locale de a, mais pas la valeur array que vous vouliez qu'il ...

+0

1er: Donc vous dites que je devrais changer x en x-1? – Edward

+0

Et au sujet de la 2ème, cela a fonctionné pour moi dans la fonction de chargement, il a correctement changé mon tableau dans le principal aussi. – Edward

+0

@Edward 1er, peut-être. Votre code est trop compliqué pour le dire facilement. – Roddy

2

Si realloc renvoie null, d'une part imprimer la quantité de mémoire que vous demandez à allouer. Si c'est un nombre négatif ou une quantité énorme, il y a le problème. Si c'est un montant raisonnable, et que vous avez une machine décente à mi-chemin, il est très improbable que vous n'ayez plus de mémoire. Donc, le système malloc() doit avoir été corrompu d'une manière ou d'une autre. Soit vous passez un pointeur invalide, soit vous avez écrit après la fin d'un bloc, peut-être dans une partie totalement indépendante du programme.

+0

J'ai posé la question parce que j'ai 8 Go ou ram donc je pensais que ce n'était pas pour obtenir une mémoire complète. – Edward

+0

Les machines modernes "surchargent" la mémoire de toute façon, même si la machine ne peut pas honorer la requête qu'elle prétend honorer, puis commence à fermer les applications si la mémoire est réellement utilisée. –

0

realloc peut changer l'adresse de base, mais le pointeur array est passé par valeur, donc une reallocation locale n'est pas visible dans le main et génère quelques problèmes.

Vous aussi reallocate à 0-taille tableau, probablement pas ce que vous voulez, s'il vous plaît utiliser x+1 comme le nombre d'enregistrements dans la réaffectation. Plus, vous accédez à l'index x avant réallocation, ce qui est un comportement indéfini comme avant la taille de réallocation est x-1, alors déplacez la ligne a[x].aa = x après réattribution.

Veuillez également initialiser vos variables (par exemple counter).