hallo, ich habe eine Funktion, mit der ich für eine einfach verkette Liste Speicher dynamisch anfordere in C. nun möchte ich meine Liste initialisieren, schaffe es aber leider nicht. int allocateListMemory(List **list) { ....malloc(...) ... *list->header.identifier = INITIALISATION_CONSTANT_ZERO; ... *list->next = NULL; } Ich möchte nicht gerade eine zweite Liste erzeugen und diese dann der Liste list zuweisen, sondern gleich für die Liste **list Speicher anfordern? Ist das irgendwie möglich und wenn ja wie?
Zumindst ich habe das Problem mit dem seltsamen fragmentarischen Codeschnipsel nicht nachvollziehen können. wie sieht denn Dein Code wirklich aus - und was genau ist die Frage ?
int allocateListMemory(List **list) { if(!(*list = malloc(sizeof(List)))) { *list = NULL; return OUT_OF_MEMORY_ERROR; } *list->content.place_name = NULL; *list->content.description = NULL; *list->header.identifier = INITIALISATION_CONSTANT_ZERO; *list->header.latitude = INITIALISATION_CONSTANT_ZERO; *list->header.longitude = INITIALISATION_CONSTANT_ZERO; *list->header.content_length = INITIALISATION_CONSTANT_ZERO; *list->next = NULL; return NO_ERROR; } mein Problem liegt nach dem if, und zwar will ich hier place.name, ... auf Null initialisieren, nur ich bin leider in C ne volle Niete und weiß nicht, wie das richtig geht.
typedef struct Header { unsigned int identifier; double latitude; double longitude; unsigned int content_length; } Header; typedef struct Content { char *place_name; char *description; } Content; typedef struct List { struct List *next; Header header; Content content; } List; List, Content und Header sollte nicht unterstrichen sein, dass macht leider die Formatierung so.
Hans M. schrieb: > List, Content und Header sollte nicht unterstrichen sein, dass macht > leider die Formatierung so. Tut sie nicht, wenn Du sie korrekt anwendest. Sieh Dir mal an, was oberhalb der Texteingabebox als erste Zeile unter dem Wort Formatierung steht.
Ich regel das immer so:
1 | typedef struct item { |
2 | struct item* next; |
3 | int id; |
4 | } item; |
5 | |
6 | typedef struct List { |
7 | item* head; |
8 | } List; |
9 | |
10 | List* List_create() { |
11 | List* liste = malloc(sizeof(List)); |
12 | liste->head = NULL; |
13 | return liste; |
14 | }
|
15 | int main (int argc, const char * argv[]) { |
16 | List* liste = List_create(); |
17 | return 0; |
18 | }
|
Vielleicht hilft es dir zum Anpassen.
Hans M. schrieb: > int allocateListMemory(List **list) Du kannst keine Liste übergeben, weil du sie ja erstellen möchtest.
1 | typedef struct Header |
2 | {
|
3 | unsigned int identifier; |
4 | double latitude; |
5 | double longitude; |
6 | unsigned int content_length; |
7 | }
|
8 | Header; |
9 | |
10 | typedef struct Content |
11 | {
|
12 | char *place_name; |
13 | char *description; |
14 | }
|
15 | Content; |
16 | |
17 | typedef struct List |
18 | {
|
19 | struct List *next; |
20 | Header header; |
21 | Content content; |
22 | }
|
23 | List; |
24 | |
25 | List* allocateListMemory() |
26 | {
|
27 | List* list = malloc(sizeof(List)); |
28 | if(list == NULL) { |
29 | //OUT_OF_MEMORY_ERROR
|
30 | } else { |
31 | list->content.place_name = NULL; |
32 | list->content.description = NULL; |
33 | list->header.identifier = INITIALISATION_CONSTANT_ZERO; |
34 | list->header.latitude = INITIALISATION_CONSTANT_ZERO; |
35 | list->header.longitude = INITIALISATION_CONSTANT_ZERO; |
36 | list->header.content_length = INITIALISATION_CONSTANT_ZERO; |
37 | list->next = NULL; |
38 | }
|
39 | return list; |
40 | }
|
41 | |
42 | int main (int argc, const char * argv[]) { |
43 | List* list = allocateListMemory(); |
44 | |
45 | return 0; |
46 | }
|
Falls du irgendwann weitere Elemente hinzufügen möchtest (was man ja meistens bei einer Liste tun möchte ^^) musst du das erste Element der Liste identifizieren können.
Christian Q. schrieb: >> int allocateListMemory(List **list) > > Du kannst keine Liste übergeben, weil du sie ja erstellen möchtest. Na sicher geht das, sieh mal genau hin und zähle die Sterne.
Rufus Τ. Firefly schrieb: > Na sicher geht das, sieh mal genau hin und zähle die Sterne. Okay ab hier muss ich mich ausklinken. Freue mich auf die Lösung..
Christian Q. schrieb: > Okay ab hier muss ich mich ausklinken. Wo ist das Problem? Was wird denn da übergeben? Ein Pointer auf einen Pointer. Und der kann dereferenziert werden,
1 | void allocateListMemory(List** list) |
2 | {
|
3 | *list = malloc(sizeof(List)); |
4 | if(*list == NULL) { |
5 | //OUT_OF_MEMORY_ERROR
|
6 | } else { |
7 | (*list)->content.place_name = NULL; |
8 | (*list)->content.description = NULL; |
9 | // etc.
|
10 | }
|
11 | }
|
12 | |
13 | int main (int argc, const char * argv[]) { |
14 | List* list; |
15 | |
16 | allocateListMemory(&list); |
17 | |
18 | return 0; |
19 | }
|
kapische. Hab ich bisher noch nie gebraucht... aber macht durchaus Sinn.
Hans M. schrieb: > int allocateListMemory(List **list) > { > if(!(*list = malloc(sizeof(List)))) > { > *list = NULL; Das ist zwar nicht weiter schädlich, aber wenn du an die Stelle kommst, dann weil *list bereits NULL ist, also brauchst du das nicht nochmal extra zuweisen. > *list->content.place_name = NULL;
1 | (*list)->content.place_name = NULL; |
Natürlich sollte in einer realen Anwendung die Funktion nicht ohne Rückgabewert sein, hier könnte z.B. beim Fehlschlagen von malloc oder beim Aufruf mit einem Nullpointer ein Fehlercode zurückgegeben werden.
Rufus Τ. Firefly schrieb: > hier könnte z.B. beim Fehlschlagen von malloc oder > beim Aufruf mit einem Nullpointer ein Fehlercode zurückgegeben werden. Beim Fehlschlagen von malloc wird doch ein Fehlercode zurückgegeben: Hans M. schrieb: > if(!(*list = malloc(sizeof(List)))) > { > *list = NULL; > return OUT_OF_MEMORY_ERROR; > }
Rolf Magnus schrieb: > Beim Fehlschlagen von malloc wird doch ein Fehlercode zurückgegeben: Je nachdem, auf welches der hier geposteten Codefragmente man sich bezieht, ja. Ich bezog mich merkwürdigerweise auf das von mir gepostete, mit dem ich "Christian Q" demonstrierte, daß Pointer auf Pointer auch funktionieren.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.