2016-03-24 2 views
0

ich eine Struktur haben, wie folgt:C ein Array-Index zu aktualisieren, die ein struct Mitglied ist aktualisiert auch alle bisherigen Indizes

struct Stack { 
int top; 
struct Token data[size]}; 
}; 

Und die folgende Push-Methode:

void push(struct Stack *st, struct Token tok) { 
(*st).top++; 
(*st).data[(*st).top] = tok; 
} 

Jedes Mal, wenn ich den Anruf Push-Methode auf einer Struktur Stack s, es aktualisiert das gesamte Array s.data (bis Index oben) mit dem neuen Wert statt nur die angegebenen Indexdaten [top]. Irgendwelche Ideen, warum das passiert?

struct Stack stack1; 
    stack1.top = -1; 

    readNext(); 
    //currentToken.value == "class" 
    push(&stack1,currentToken); 

    readNext(); 
    //currentToken.value == "test" 
    push(&stack1,currentToken); 

    readNext(); 
    //currentToken.value == "{" 
    push(&stack1,currentToken); 

    readNext(); 
    //currentToken.value == "int" 
    push(&stack1,currentToken); 

    printStack(stack1); 

Ausgabe lautet:

int 
int 
int 
int 
+1

Mehr Code anzeigen. BTW '(* st) .' sollte' st-> 'geschrieben werden. –

+0

@michael Waltz: Die Push-Methode wird wie folgt aufgerufen: push (& stack1, currentToken); – bzak

+1

Zeigen Sie uns sowohl den Codeaufruf als auch den Code, der Ihnen sagt, dass das gesamte Array aktualisiert wurde. –

Antwort

2

Jedes Mal, wenn ich die Push-Methode s auf eine Struktur Stapel aufrufen, aktualisiert sie das gesamte Array s.data (bis oben Index) mit dem neuen Wert stattdessen nur der angegebenen Indexdaten [top].

Nein, tut es nicht. Nur ein Element von d->data ist geändert. Der Wert des Tokens, das (durch Kopieren seines Werts) an die push()-Funktion übergeben wurde, wird in ein Element des that-Arrays kopiert.

Irgendwelche Ideen, warum das passiert?

Sie denken, Sie sehen alle Array-Elemente aktualisiert werden, weil Sie eine Art von Aliasing haben. Die push() Funktion ist im Klartext - es ist fast sicher, welche Funktion Sie verwenden, um neue Token zu generieren, ist das Problem.

Zum Beispiel können Sie so etwas wie dieses:

/* Hypothetical example */ 

struct Token { 
    int type; 
    char *value; 
}; 

char buffer[100]; 

void readTokens() { 
    Struct Stack stack = { -1 }; 
    struct Token tok; 

    while (scanf("%s", buffer) == 1) { 
     tok.value = buffer; /* the error is here in this case */ 
     tok.type = 42; 
     push(&stack, tok); 
    } 
} 

Beachten Sie, dass value Mitglieder aller in diesem Fall beteiligt Token, einschließlich aller Kopien, zeigen Sie auf die gleichechar[], deren Inhalt aktualisiert werden jedes Mal, wenn ein neues Token gelesen wird. Jeder muss stattdessen einen Zeiger auf eine Kopie des Arrays erhalten. Im Allgemeinen müssten solche Kopien dynamisch zugewiesen werden, beispielsweise über strdup().

UPDATE:

Der zusätzliche Code Sie auf dem Laufenden ist nicht schlüssig, aber es ist im Einklang mit meiner Diagnose. Sie würden das von Ihnen beschriebene Verhalten beobachten, wenn currentToken.value ein char * ist (im Gegensatz zu char[]) und readNext() das Array ändert, auf das es zeigt, anstatt einen neuen Zeiger zuzuweisen, wie oben beschrieben.

+0

Danke, ich hatte einen leeren Moment.Ich muss den Wert von currentToken in der Push-Methode kopieren, anstatt Array [top] so einzustellen, dass er auf currentToken zeigt, das sich ständig ändert. – bzak

+0

@ Zak00, nein, Sie bekommen es nicht. Sie kopieren bereits 'currentToken', wenn Sie es an' push() 'übergeben, und erneut, wenn Sie diese Kopie einem Array-Element zuweisen. Das Problem besteht darin, dass das, was Sie kopieren, einen Zeiger auf einen statischen Puffer oder etwas ähnliches enthält. –

Verwandte Themen