Hallo, bin etwas verwirrt, was die Benutzung von malloc angeht.
Das hier war mein Kenntnisstand:

Bei einfachen Typen (int, char, ...) braucht man's nicht (die Variable landet dann im Stack). Aber wie ist's bei structs? Ich weiß, die kann man entweder direkt ansprechen (x.y) oder über einen pointer (x->y), aber muss ich für alles, worauf ich per pointer zugreifen will, erst per malloc() Speicher reservieren? Ich glaube nicht, denn bei meinem konkreten Problem sieht die Sache so aus:
Code:
GList *list = NULL;
int i = 1;
g_list_prepend(list, i);

GList *l;
for(l = list;
    l;
    l = l->next) {
    printf("Element %d\n", l->data);
}
Das funktioniert, da wird mit genau das eine Element angezeigt und es gibt keinen Fehler. Hier hab' ich für GList keinen Speicher reserviert, sondern den list-pointer auf NULL zeigen lassen. Das ist wohl auch der richtige Weg, GList zu benutzen.
Per malloc (genauer gesagt g_malloc, was in g_new benutzt wird) funktioniert's nicht:
Code:
GList *list = g_new(GList, 10); // potenziell 10 Element?!
int i = 1;
g_list_prepend(list, i);

GList *l;
for(l = list;
    l;
    l = l->next) {
    printf("Element %d\n", l->data);
}
Und hier zeigt er mir noch Element 1 an, will dann aber auf Element 2 gehen, weil der temporäre GList-Pointer l offensichtlich nicht NULL ist, dann gibt's nen segmentation fault. Ich versteh jetzt nicht warum. Werden bei g_new(GList, 10) gleich 10 GList-Instanzen aufgebaut mit 10 next- und prev-Pointern, die sich gegenseitig referenzieren? Und wieso ist deren data-Pointer dann nicht =NULL? Der Code funktioniert übrigens auch nicht, wenn ich g_new(GList, 1) sage, da will er auch auf ein zweites Element gehen und stürzt mit nem segfault ab.

Aber das nur um meine konkreten Probleme zu schildern. Generell würde ich gerne wissen: wann nutze ich malloc und wann nicht?

- Ist das abhängig davon, ob ich per Pointer drauf zugreife?
- Ist das abhängig vom Datentyp?
- Ist das abhängig von der Anzahl der Elemente (i.e. ich sollte malloc nur nutzen, wenn ich 100kB und mehr Speicher für meine Daten benötige)?
- Ist das abhängig davon, ob ich den stack oder den heap nutzen will (und den stack will ich ja nicht zumüllen, also geht das bestimmt auch in die Richtung, dass ich ab 100kB immer den heap nutzen sollte und daher ab 100kB immer malloc verwenden sollte)?