2017-01-20 7 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."); 
} 

Ich schreibe einen Schutz über einige Lotto-Dateien. Ich habe dieses Problem in meiner Funktion, die dem Lotteriefeld mehr Daten hinzufügt. Wann immer x 1989 enthält, gibt mein realloc Aufruf NULL zurück. Ich setze x auf 1985 und i könnte 4 weitere Eingänge zum Array hinzufügen, aber immer wenn x 1989 ist, gibt es immer noch NULL zurück. Meine Frage ist: ist etwas mit dem Code falsch oder ich habe immer noch nicht genug Speicher?Realloc Rückgabe NULL

+5

Wir müssen etwas mehr Code sehen; Könntest du ein "main" einfügen, das zeigt, wie diese Funktion aufgerufen wird? – Bathsheba

+2

Sie müssen nicht auf "malloc/realloc" übertragen –

+1

Und bitte formatieren Sie Ihren Code richtig. –

Antwort

0

Zwei wesentliche Fehler:

C Array-Indizierung bei Null beginnt, so, nachdem Sie x * sizeof(thing) realloc, nur Elemente null bis x-1 gültig sind. Zugriff auf Element x wird Chaos verursachen.

Zweitens ändert a = b die lokale Kopie von a, aber der Wert nicht array, dass Sie es ...

+0

1: Also sagen Sie, dass ich x zu x-1 ändern sollte? – Edward

+0

Und über die zweite funktionierte es für mich in der Load-Funktion, es änderte auch richtig mein Array in main. – Edward

+0

@Edward 1. Vielleicht. Ihr Code ist zu verschachtelt, um ihn zu erkennen. – Roddy

2

wollte Wenn realloc gibt null zurück, zunächst die Menge an Speicher zugewiesen werden Sie fragen, ausdrucken. Wenn es eine negative Zahl oder eine große Menge ist, gibt es das Problem. Wenn es eine vernünftige Menge ist und Sie einen halbwegs ordentlichen Rechner haben, ist es sehr unwahrscheinlich, dass Sie nicht genügend Speicher haben. Also muss das malloc() System in irgendeiner Weise beschädigt worden sein. Entweder übergeben Sie einen ungültigen Zeiger oder Sie haben über das Ende eines Blocks hinaus geschrieben, vielleicht in einem völlig unabhängigen Teil des Programms.

+0

Ich fragte die Frage, weil ich 8GB oder RAM habe, so dass ich, obwohl es anders war, um einen Speicher voll zu bekommen. – Edward

+0

Moderne Maschinen "über" commit "Speicher sowieso, also selbst wenn die Maschine die Anforderung nicht erfüllen kann, behauptet es, es zu ehren, dann startet heruntergefahren Apps, wenn der Speicher tatsächlich verwendet wird. –

0

realloc kann die Basisadresse ändern, aber array Zeiger werden durch den Wert übergeben, so dass ein lokales reallocation nicht sichtbar in den main ist und erzeugt einige Probleme.

Sie auch reallocate zu 0-Array, wahrscheinlich nicht das, was Sie wollen, verwenden Sie bitte x+1 als die Anzahl der Datensätze in der Neuzuweisung. Mehr, Zugriff auf Index x vor der Neuzuweisung, die undefiniert Verhalten wie vor der Neuzuweisung Größe ist x-1, so verschieben Sie die Zeile a[x].aa = x nach Neuzuweisung.

Bitte initialisieren Sie auch Ihre Variablen (wie counter).