Liste in Funktion initialisieren

#2467436
Lesenswert?

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?
#2467462
Lesenswert?

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.
#2467468
Lesenswert?

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.
#2467497
Lesenswert?

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.
#2467575
Lesenswert?

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.
Persönliche Seite #2467635
Lesenswert?

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
}
#2467693
Lesenswert?

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;
Persönliche Seite #2467751
Lesenswert?

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.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren