2012-04-06 5 views
0

So wird der Benutzer unbekannte Anzahl von Wörtern eingeben ,, ich nehme an, dass jedes Wort hat maximale Länge 10; Ich habe den Lvalue als linken Operanden der Zuweisung erorr aus dem Realloc benötigt. Ich bin neu in C und ich versuchte Google, kann aber keine sinnvolle Antwort finden.Wie die Wörter von Array neu zuweisen?

Code:

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

    #define CAPACITY 10 
    #define NUM_OF_WORDS 10 
    int main(void) 
    { 

    char *word= malloc(10*sizeof(char)); 
    char *w[NUM_OF_WORDS]; 

    int i; 
    int n; 

    for(i = 0 ; scanf("%s", word)==1; ++i) 
    { 

    if(i == NUM_OF_WORDS-1) 
    w = realloc(w, (NUM_OF_WORDS*=2) * sizeof(char)); 

    w[i] = malloc(strlen(word)+1 * sizeof(char)); 
    strcpy(w[i], word); 
    } 

    return 0; 
    } 

Antwort

2
  1. NUM_OF_WORDS konstant ist, kann es nicht zugeordnet werden.

  2. w sollte nicht Array verwenden, sollten char **

  3. In realloc, sollten Sie sizeof (char *)

Modified-Code verwenden:

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

#define CAPACITY 10 
#define NUM_OF_WORDS 10 

int main(void) 
{ 

    char word[10]; 
    char **w = (char **) malloc(NUM_OF_WORDS * sizeof(char *)); 

    int i; 
    int capacity = NUM_OF_WORDS; 

    for(i = 0 ; scanf("%s", word)==1; ++i) 
    { 

     if(i == capacity -1) 
      w = (char **)realloc(w, (capacity *=2) * sizeof(char *)); 

     w[i] = (char *)malloc(strlen(word)+1 * sizeof(char)); 
     strcpy(w[i], word); 
    } 

    // at last, release w and w's element. 
    while (--i >= 0) 
    { 
     free(w[i]); 
    } 

    free(w);  
    return 0; 
} 
+0

Du hast es kristallklar erklärt! Ich danke dir sehr! –

1

Wenn Sie in der Lage sein wollen realloc() zu verwenden, werden Sie das Array zuweisen müssen w mit malloc() anstatt sie auf den Stapel zu erklären.

+0

Vielen Dank für deine Zeit. Ich verstehe nicht, was Sie meinten, indem Sie es auf dem Stapel deklarierten? –

+0

Statt 'char * w [NUM_OF_WORDS]' möchten Sie 'char * w [] = malloc (NUM_OF_WORDS * WORD_LENGTH);' Dabei ist WORD_LENGTH die maximale Länge jedes Worts im Array (d. H. 10). Wenn Sie den ersten Weg deklarieren, legt der Compiler das Array auf den Stack, wo es nicht skaliert werden kann. Wenn Sie das Array mit 'malloc()' zuweisen, wird der Speicher aus dem Heap übernommen, wo er in der Größe geändert werden kann. Der Stack und der Heap sind zwei Teile des Speichers, die auf verschiedene Arten verwendet werden - Erklärungen sind leicht zu finden. – Caleb

0
w = realloc(w, (NUM_OF_WORDS*=2) * sizeof(char)); 

Hinsichtlich der Fehler -

(NUM_OF_WORDS * = 2) nach der Vorverarbeitung (10 * = 2). Du kannst kein Produkt von 10 * 2 zu 10 zuweisen. 10 ist ein rvalue und kann keinem Ding zugewiesen werden, worüber der Compiler sich beschwert. Sie proabably gemeint (NUM_OF_WORDS * 2)

Verwandte Themen