Bei dem ersten Beispiel gibt er mir keinerlei Warnungen aus (gcc Gentoo 3.3.6).
Kompilier deine Sachen einfach mit "-Wall" - dann warnt dich der Compiler. Sollte man eh immer machen.
Heisst das also, dass jede Zuweisung wie
c = "whatever";
den String zwischen den " neu in den Speicher schreibt und diese Adresse dem Pointer dann zuweist?
Ganz genau. "whatever" ist dann aber vom Typ "const char*" und darf somit nicht veraendert werden. Deshalb sollte dich der Compiler auch warnen, denn wenn du versuchst "whatever" mit einem String gleicher laenge zu ueberschreiben, dann stuerzt dein Programm mit einem "bus error" ab.
Sauberer Stil ist es also Konstanten auch als const zu markieren:
Und beim ersten Beispiel reserviert der Compiler für 'bar' einen Speicherbereich der Größe sizeof(char *) und nicht Platz für die chars selbst?!
Ebenfalls richtig. Allerdings reserviert der Compiler nicht sizeof(char*) sondern sizeof(struct foo) - was in diesem Fall aber das gleiche ist.
Ist das denn dann so in Ordnung oder würde man das irgendwie anders machen?
Sprich, sollte ich im zweiten Beispiel dann für den Pointer auf das struct 4 Byte (=sizeof(char *)) oder 4 + x Bytes reservieren wenn ich x chars speichern will?
Korrekt sollte das zweite Beispiel so aus sehen (ungetestet - also vielleicht doch nicht ganz korrekt):
Code: Select all
int main()
{
struct foo* bar = (struct foo*)malloc(sizeof(struct foo));
bar->c1 = (char*)malloc(6 * sizeof(char));
strncpy(bar->c1, "Hallo", 6);
printf("%s\n", bar->c1);
return (0);
}
Gruss,
Alex