Einfache Frage zu Zeigern auf C-Strings
-
Hallo,
warum bekomme ich bei folgendem Code einen Speicherzugriffsfehler:
struct t{ char *p; }; int main(int argc, char** argv) { struct t *t1; t1->p = "Test"; return 0; }
Wenn ich zum Beispiel folgendes mache:
char *p = "Test";
klappt dies einwandfrei. Aber müsste es nicht vom Prinzip her die gleiche Zuweisung sein?
-
struct t *t1=NULL; t1->p = "Test";//crash!
du wolltest vielleicht
struct t tDing; struct t *t1=&tDing;
oder
struct t *t1=malloc(sizeof(struct t));
-
Vielen Dank!
Kurze Frage dazu:
struct t tDing; struct t *t1=&tDing;
Erzeugt die Struktur auf dem Stack, oder?
struct t *t1=malloc(sizeof(struct t));
Erzeugt die Struktur auf dem Heap und ich muss diese expliziet mittels free() wieder freigeben?
Kann man pauschal sagen, die eine der beiden Varianten meistens die Bessere ist, oder hängt das eher allgemein davon ab, ob man die Instanz auf dem Stack oder auf dem Heap erzeugen möchte?
-
Das hängt davon ab wie die Gegebenheiten sind. Für temporäre Objekte bietet sich der Stack an, z.b. bei Variablen, die nur innerhalb einer Funktion verwendet werden müssen. Variablen dynamisch auf dem Heap anzulegen macht man zb. dann, wenn man zur Compile Zeit noch nicht weiss, wieviel Speicher man benötigt.