Forum: PC-Programmierung Liste in Funktion initialisieren


von Hans M. (fuxdancer)


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?

von NurEinGast (Gast)


Lesenswert?

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 ?

von Hans M. (fuxdancer)


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.

von Christian Q. (osx)


Lesenswert?

Wo ist dein struct?

von Hans M. (fuxdancer)


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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Christian Q. (osx)


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.

von Christian Q. (osx)


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.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Christian Q. (osx)


Lesenswert?

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..

von Rufus Τ. F. (rufus) Benutzerseite


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
}

von Christian Q. (osx)


Lesenswert?

kapische. Hab ich bisher noch nie gebraucht... aber macht durchaus Sinn.

von Rolf M. (rmagnus)


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;

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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.

von Rolf M. (rmagnus)


Lesenswert?

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;
>   }

von Rufus Τ. F. (rufus) Benutzerseite


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.

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
Noch kein Account? Hier anmelden.