2016-12-05 5 views
0

Ich möchte ein Programm schreiben, das ein dynamisches Array im Speicher zuweist und es auf Eingabe bis zum Wert "-1" lauscht. Ich mache das, aber es verbraucht zu viel Speicher.Dynamisches Array in c mit Terminator-Zeichen

int *a=malloc(sizeof(int)); 
int i=0; 
int j; 
while (a[i-1]!=-1){ 
scanf("%d",a+i); 
i++; 
a=realloc(a,(i+2)*sizeof(int)); 
        } 
+3

Bitte definieren „zu viel Speicher“. Und welchen Wert erwarten Sie 'a [i-1]' zu sein, wenn 'i' 0 ist? – kaylum

+0

ok, und wie kann ich es in Alternative tun? – fenigo69

+0

Was tun? Um das 'a [i-1]' Problem zu beheben, können Sie den Loop von 'while' in' do/while' ändern. – kaylum

Antwort

1

Sie verarbeiten keinen Eingabefehler. Wenn scanf nicht gelesen werden kann, hat Ihr Programm undefiniertes Verhalten, was dazu führen kann, dass es schnell genug Speicher verbraucht und dann abstürzt.

Es wird auch empfohlen, realloc Fehler zu behandeln, und auch nicht jedes Mal neu zuweisen.

das alles zusammen Einlochen, und die Vermeidung auch das Hinzufügen -1 auf das Array, könnte es etwa so aussehen:

/* values are read into this buffer */ 
int size = 16, count = 0; 
int *a = malloc(size * sizeof(int)); 

/* loop control variables */ 
int done = 0; 
int error = 0; 

/* temporary variables */ 
int val, new_size, *new_a; 

while(!done) 
{ 
    /* double the buffer size when required */ 
    if(count == size) 
    { 
     new_size = size * 2; 
     new_a = realloc(a, new_size * sizeof(*a)); 
     if(!new_a) { 
      perror("Realloc failed"); 
      error = 1; 
      break; 
     } else { 
      a = new_a; 
      size = new_size; 
     } 
    } 

    /* read value and finish on input error or if user enters -1 */ 
    if(1 != scanf("%d", &val) || val == -1) { 
     done = 1; 
    } else { 
     a[count++] = val; 
    } 
}