2017-04-14 14 views
0

Ich habe eine wirklich schlimme Zeit mit Zeigern und Arrays und ich brauche wirklich Hilfe.Array von Zeigern einer Struktur in C

Es ist eine Übung, die diese Struktur haben:

typedef struct student_node{ 
    unsigned number; 
    const char *name; 
    unsigned class; 
    struct student_node *next; 
} StudentNode; 

Und ich habe diese Funktion zu implementieren:

void groupStudentByClass(StudentNode *classes[], StudentNode students[], size_t num_students) 

Mein Problem ist, ich so etwas wie die Zahl der Klassen ändern möchten, und drucken der Wert und ich kann nicht. Es gibt mir "Segmentation fault (core dumped)". Aber ich verstehe nicht, warum ...

Dies ist der Testcode:

size_t nClasses=3; 
StudentNode *classes [nClasses]; 
classes[0]->number=0; 
printf("%u\n",classes[0]->number); 

Btw i malloc und die Dinge nicht, die Speicher zuweisen können.

+0

auf stackoverflow.com, wenn Sie eine Frage über ein Laufzeitproblem stellen (wie diese Frage), gibt es bestimmte Anforderungen. Veröffentlichen Sie die tatsächliche Eingabe, Veröffentlichen Sie die tatsächliche Ausgabe, Veröffentlichen Sie die erwartete Ausgabe, Veröffentlichen Sie eine kurze, vollständige, sauber kompiliert Code, der weiterhin das Problem aufweist. In diesem Fall werden die Anforderungen für den gebuchten Code nicht erfüllt. Diese Anforderung bezüglich des Codes, die nicht erfüllt wird, macht diese Frage vom Thema. – user3629249

Antwort

0

@Matthias hat bereits erklärt, warum Sie die SEGV bekommen .

Wenn Sie malloc nicht verwenden können, müssen Sie die Strukturen vorab zuordnen.So etwas wie

const size_t MAX_STUDENT = 1024; 
StudentNode studentPool[MAX_STUDENT]; 
int studentLast = -1; 

Dann benötigen Sie eine Zuordnungsroutine

StudentNode* StudentGet() 
{ 
    if (++studentLast >= MAX_STUDENT) 
    { 
     /* Print error message and exit */ 
    } 
    return studentPool[studentLast]; 
} 

Als nächstes, wenn Sie

classes[0] = StudentGet(); 

zuweisen müssen Dann können Sie Ihre Aufgaben und Drucke tun.

Sie müssen möglicherweise auch Routinen schreiben, um die Strukturen freizugeben und sie an den Pool zurückzugeben.

+0

Danke. Mit deiner Antwort denke ich, dass ich weiß, was ich tun muss. Ich habe ein Array von Zeigern, die auf nClasses-Strukturen zeigen. Und da sie alle Zeiger sind und sie im Nur-Lese-Teil sind. Also muss ich den nächsten Zeiger verwenden, um auf die Schüler zu zeigen. Dieser Teil ist immer noch nicht gut in meinem Gehirn verbrannt, aber ich denke, ich bekomme es. Nochmals vielen Dank :) –

0
StudentNode *classes [nClasses]; 

Erstellt nur 3 Zeiger. Aber sie zeigen auf nichts. So

classes[0] 

nicht im Speicher vorhanden ist.

Ich denke, Sie sollten die Zeiger verwenden, die Sie durch die Argumente Ihrer Funktion erhalten.

+0

Vielen Dank. Mit deiner Antwort denke ich, dass ich weiß, was ich tun muss. Ich habe ein Array von Zeigern, die auf nClasses-Strukturen zeigen. Und da sie alle Zeiger sind und sie im Nur-Lese-Teil sind. Also muss ich den nächsten Zeiger verwenden, um auf die Schüler zu zeigen. Dieser Teil ist immer noch nicht gut in meinem Gehirn verbrannt, aber ich denke, ich bekomme es. Nochmals vielen Dank :) –

0

Diese Zeile:

StudentNode *classes [nClasses]; 

Ordnet eine Reihe von 3-Zeiger, aber diese Zeiger sind NULL bestenfalls (noch schlimmer, sie jeden beliebigen Müll enthalten können). Auch wenn Sie nicht malloc verwenden können (ich nehme an, es ist ein Teil der Hausaufgaben), können Sie Ihre student_node structs auf den Stapel gelegt, wie folgt aus:

StudentNode s0 = { 
    .number = 0, 
    .name = "Alice", 
    .class = 0, 
}; 

StudentNode s1 = { 
    .number = 1, 
    .name = "Bob", 
    .class = 0, 
}; 

StudentNode s2 = { 
    .number = 2, 
    .name = "Peter", 
    .class = 0, 
}; 

Und dann ist die Kette sie zusammen:

s0.next = &s1; 
s1.next = &s2; 
// leave s2.next NULL 

Und dann, endlich, können Sie die ersten Schüler in der Kette zu classes[0] zuweisen:

classes[0] = &s0; 
+0

Danke. Mit deiner Antwort denke ich, dass ich weiß, was ich tun muss. Ich habe ein Array von Zeigern, die auf nClasses-Strukturen zeigen. Und da sie alle Zeiger sind und sie im Nur-Lese-Teil sind. Also muss ich den nächsten Zeiger verwenden, um auf die Schüler zu zeigen. Dieser Teil ist immer noch nicht gut in meinem Gehirn verbrannt, aber ich denke, ich bekomme es. Nochmals vielen Dank :) –

0

ich glaube, Sie einen Zeiger auf einen Zeiger in Klassen nicht brauchen. Was Sie wirklich wollen, in Ihrem Test-Code zu tun wäre

size_t nClasses=3; 
StudentNode classes [nClasses]; 
classes[0].number=0; 
printf("%u\n",classes[0].number); 

Auch da Sie malloc verwenden kann ich nicht für den defination

tun dies empfehlen
typedef struct student_node{ 
    unsigned number; 
    const char name[100]; // or whatever max name size you want 
    unsigned class; 
    struct student_node *next; 
} StudentNode; 
+0

Danke. Mit deiner Antwort denke ich, dass ich weiß, was ich tun muss. Ich habe ein Array von Zeigern, die auf nClasses-Strukturen zeigen. Und da sie alle Zeiger sind und sie im Nur-Lese-Teil sind. Also muss ich den nächsten Zeiger verwenden, um auf die Schüler zu zeigen. Dieser Teil ist immer noch nicht gut in meinem Gehirn verbrannt, aber ich denke, ich bekomme es. Nochmals vielen Dank :) –