2017-01-23 3 views
1

Ich bin ziemlich neu in C, und habe Probleme herauszufinden, wie zusammenhängende Speicher zu einem Array von Strukturen zuweisen. In dieser Aufgabe erhalten wir eine Shell des Codes und müssen den Rest ausfüllen. Daher kann ich die Variablennamen oder Funktionsprototypen nicht ändern. Das ist, was mir gegeben wurde:Wie dynamisch Speicher für ein Array von Strukturen zuweisen

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

struct student { 
    int id; 
    int score; 
}; 

struct student *allocate() { 
    /* Allocate memory for ten students */ 
    /* return the pointer */ 
} 

int main() { 
    struct student *stud = allocate(); 

    return 0; 
} 

Ich bin nur nicht sicher, wie zu tun, was diese Kommentare in der Zuweisungsfunktion sagen zu gehen.

+0

Holen Sie sich einen besseren Kurs. Die Funktionssignaturen werden abgeraten und sollen aus einem zukünftigen Standard entfernt werden. Verwenden Prototyp-Stil, z.B. 'int main (void)'. – Olaf

Antwort

6

Die einfachste Art und Weise zuzuweisen und um das Array zu initialisieren, ist dies:

struct student *allocate(void) { 
    /* Allocate and initialize memory for ten students */ 
    return calloc(10, sizeof(struct student)); 
} 

Anmerkungen:

  • calloc(), im Gegensatz zu malloc() initialisiert den Speicherblock alle Bits Null. Daher werden die Felder id und score aller Elemente im Array auf 0 initialisiert.
  • Es wäre eine gute Idee, die Anzahl der Studenten als Argument an die Funktion allocate() zu übergeben.
  • Es wird als guter Stil free() Speicher zugeordnet, wenn Sie es nicht mehr benötigen. Ihr Lehrer gab nicht an, dass Sie free(stud); anrufen sollten, bevor Sie von main() zurückkehren: Obwohl nicht unbedingt erforderlich (der gesamte vom Programm zugewiesene Speicher wird vom System zurückgewonnen, wenn das Programm beendet wird), ist es eine gute Angewohnheit, es zu finden Speicherlecks in größeren Programmen.
+0

Ich frage mich, ob der Lehrer absichtlich einen Anruf zu 'free()' ausgelassen hat ... – stevieb

+1

@stevieb: guter Punkt, habe ich eine Notiz zu diesem Thema hinzugefügt. – chqrlie

+0

Verwenden Sie 'calloc (10, sizeof (struct student))', um dem Stil der C-Spezifikation für 'void * calloc (size_t nmeb, size_t size) zu folgen;' – chux

Verwandte Themen