2016-03-26 5 views
0

Ich muss einen Puffer mit variabler Länge von struct player s innerhalb einer Funktion initialisieren. Bisher das ist, was ich kam mit:Erstellen einer Struktur auf dem Stapel innerhalb einer Funktion und Zuweisen einer Array-Position eines Arrays, das in einer anderen Funktion erstellt wurde

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

struct player{ 
    char name; 
}; 

void players_init(struct player **players){ 
    *players = malloc(2 * sizeof(struct player)); 
    struct player p1, p2; 
    p1.name = 'X'; 
    p2.name = 'Y'; 

    (*players)[0] = p1; 
    (*players)[1] = p2; 
} 

int main(int argc, char *argv[]) 
{ 
    struct player *players = NULL; 
    players_init(&players); 
    printf("%c\n", players[0].name); // prints X 
    printf("%c\n", players[1].name); // prints Y 

    return 0; 
} 

Meine Frage ist: da ich p1 und p2 innerhalb einer Funktion bin erstellen, sollten diese beiden Variablen auf dem Stack-Frame zu derselben Funktion gewidmet zugeordnet werden, Wenn diese Funktion beendet wird, sollten diese Variablen weg sein.

Wie Sie an meinem Beispiel sehen können, weise ich diese Variablen den Positionen des Puffers players zu, der in einer anderen Funktion erstellt wurde.

Ich frage mich, warum mein Code funktioniert (wenn es wirklich funktioniert), da ich grundsätzlich Variablen referenziere, die aus meinem Verständnis nicht mehr existieren sollten, wenn players_init endet.

Was fehlt mir?

+0

Make 'players_init' an einem einen Spieler init Zeit, und übergeben Sie ihm einen 'Char'-Namen zu verwenden. Dann nenne es: 'players_init (& players, 'X'); players_init (& players, 'Y'); ' Dies wird wahrscheinlich Ihren Code wie erwartet unterbrechen, da Sie den nicht initialisierten Speicher überschreiben werden, der Ihren vorhandenen Code scheinbar korrekt funktionieren lässt. – sehrgut

Antwort

1

Da Sie die gesamte Struktur in das Array kopieren, funktioniert es. Wenn Sie nur die Adresse p1 und p2 verwenden, dann hätten Sie ein undefiniertes Verhalten, weil Sie sagen, p1 und p2` gehen außerhalb des Geltungsbereichs.

Ihr Fall ist trivial, aber in der realen Welt nur bewusst sein, Sie eine Struktur Kopie tun, so müssen Sie wissen, sind die Bits kopiert und welche nicht

+0

Ok. Also, theoretisch muss ich nur auf "struct player" Variable "p" erstellen und ändern Sie sein Feld "name" vor der Zuweisung, da in jedem Fall eine Kopie der Struktur erstellt wird ...? – nbro

+0

Ja. Sie könnten "p1" und "p2" durch "p" ersetzen und die Elemente im Array nacheinander mit demselben "p" initialisieren. Ist es das, was du meintest? – John3136

+0

Ja. Vielen Dank! Kennen Sie ein gutes Tutorial, das über Probleme im Zusammenhang mit diesem Thema spricht, d. H. Wann genau sollten wir vorsichtig sein usw.? – nbro

Verwandte Themen