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?
Gast
#2467445
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.
Wo ist dein struct?
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
19 | |
20 | |
21 | |
22 | |
23 | |
24 | |
25 | |
26 | |
27 | |
28 | |
29 | |
30 | |
31 | |
32 | |
33 | |
34 | |
35 | |
36 | |
37 | |
38 | |
39 | |
40 | |
41 | |
42 | |
43 | |
44 | |
45 | |
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 | |
2 | |
3 | |
4 | |
5 | |
6 | |
7 | |
8 | |
9 | |
10 | |
11 | |
12 | |
13 | |
14 | |
15 | |
16 | |
17 | |
18 | |
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 | |
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.
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.