2017-10-23 2 views
0

Ich versuche, eine Sequenz von Buchstaben vom Benutzer zu erhalten und die Eingabe in ein dynamisches Array zu setzen.Realloc schlägt nach der 10. Iteration innerhalb einer Schleife fehl

Aber aus einem Grund kann ich nicht ganz herausfinden - Realloc schlägt fehl (gibt NULL zurück und "Fehler beim Zuweisen von Speicher!" Wird gedruckt), wenn der Benutzer mehr als 10 Buchstaben eingegeben hat. Ich habe versucht, Realloc zu Calloc zu ändern, und das scheint es zu lösen, aber ich bin mir nicht sicher warum.

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

int main (int argc, char **argv) { 

    char *first_string, *second_string, *memory_check; 
    char user_input; 
    int first_string_size = 0, second_string_size = 0, debug =1; 

    first_string = malloc(sizeof(char)); 
    second_string = malloc(sizeof(char)); 


    // gets the strings from the user 

    printf("Input the first string:"); 

    for(int i = 0;;i++) { 
     user_input= getchar(); 
     if(user_input == EOF || user_input == '\0' || user_input == '\n') { 
      break; 
     } 
     first_string[i] = user_input; 
     memory_check = realloc(first_string, (i+1)*(sizeof(char))); 
     if(memory_check == NULL) { 
      printf("\nError allocating memory!\n"); 
      break; 
     } 

     first_string_size = i; 

     if(debug == 1) { 
      printf("\n number of letters is %d", first_string_size +1); 
      printf("\n array size in memory is %d", sizeof(first_string) * (i+1)); 
     } 
    } 

    return 0; 
} 
+0

Probieren Sie 'perror' beim Drucken von Fehlern, es gibt weitere Details. Ändere deine 'printf (" Error alloc.. "zu' perror ("realloc"); ' –

+0

Zwei nicht verwandte Hinweise: 1) Grow um einen größeren Betrag als N + 1, zB verdopple immer die Größe, wenn der Speicherplatz erschöpft ist) sizeof (char) ist [definiert als 1] (http://chimera.roma1.infn.it/SP/COMMON/iso-iec-9899-1990.pdf#page=108&zoom=auto,-133,792). – kay

+7

'memory_check' ist der neu zugewiesene Zeiger, Sie müssen diesen Wert mit' first_string' handeln. 'first_string' zeigt auf Speicher, der bereits freigegeben wurde (durch realloc). – MFisherKDX

Antwort

3

natürlich ist es nicht:

memory_check = realloc(first_string, (i+1)*(sizeof(char))); 
    if(memory_check == NULL) { 
     printf("\nError allocating memory!\n"); 
     break; 
    } 

Sie memory_check als Flag verwenden zu überprüfen, ob Sie neu zuweisen können, aber es ist nicht nur das.

Sie haben, um es wieder zu first_string zuzuweisen.

In Ihrem Fall ist es ein totes Werbegeschenk: die ersten 10 mal (in Ihrem Fall ist dies natürlich nicht angegeben oder definiert, es ist rein zufällig), muss der Speicherbereich nicht bewegt werden, was erklären, dass es funktioniert. Aber nach einer Weile kann realloc den gleichen Block nicht wiederverwenden (weil es zu klein ist) und es ändert den Speicherort.

Da Sie es nicht aktualisieren, erhalten Sie undefiniertes Verhalten.

Sie können dies tun:

memory_check = realloc(first_string, (i+1)*(sizeof(char))); 
if(memory_check == NULL) { 
    printf("\nError allocating memory!\n"); 
    free(first_string); 
    break; 
} 
first_string = memory_check; 
2

Sie sind zu deallokierten Speicher zu schreiben.

memory_check ist der neu zugewiesene Zeiger, Sie müssen diesen Wert mit first_string handeln. first_string zeigt auf Speicher, der bereits freigegeben wurde (durch Realloc)

Verwandte Themen