S
mythtranor schrieb:
reservere ich (streng genomen) mit char a[5] keinen Speicher in der Größe con 5 Byte?
doch, aber der Speicher befindet sich auf dem Stack und ist nur für die Funktion gültig, die das Array deklariert hat. malloc(5) reserviert auch 5 Bytes, aber auf dem Heap und ist solange gültig, bis man den Speicher explizit freigibt.
mythtranor schrieb:
Was ist der Unterschied zwischen array variabler Größe und veränderbarer Speicher?
Derselbe wie bei Äpfeln und Birnen du meinst zwischen arrays fester und variable Größe, oder?
bist C98 konnte man nur Arrays fester Größe erstellen, sprich, zur Compilezeit musste schon feststehen, wie viele Elemente das Arrays haben wird
char arr[1024];
char arr[1024] = "Hallo";
char arr[] = "Hallo";
char arr[];
int n = 9;
char [n];
die erste Anweisung deklariert ein 1-dim char Array mit 1024 Felder
die zweite Anweisung macht dasselbe, die ersten 6 Bytes werden zusätzlich mit 'H', 'a', 'l', 'l', 'o', '\0' initialisiert
die dritte macht dasselbe wie die zweite, mit dem Unterschied, dass nur 6 Bytes reserviert werden. Der Compiler weiß, dass "Hallo" 6 Bytes braucht, also reserviert er auch 6 Bytes auf dem Stack für dieses Array. Es sieht nur so aus, als würde das ein Array variabler Größe sein, ist es aber nicht. Der Compiler weiß schon, wie groß das Array sein wird. Zur Laufzeit ändert sich dort aber gar nichts.
die vierte Anweisung ist ein Syntaxfehler.
die fünfte Anweisung ist ein VLA, ein Array variable Länger, das geht aber nur ab C99.
Alle sind Arrays, die Größe des Arrays kann man während der Laufzeit nicht verändern. Du kannst nur bei dynamisch angeforderten Speicher die Größe verändern.