Frage zur Speicherreservierung

BoT

Mitglied
Ich habe eine Frage zur Speicherreservierung von Arrays und Zeigern...

Und zwar verwirrt mich folgendes:
Code:
void main(void)
{
	char *str;
	int  *zahl;

	str = "Test!";
	zahl = { 1,2,3 };

	printf("String: %s\n", str);
	printf("Zahlen: %i\n", zahl);
	getchar();
}

Dieser Code funktioniert bei mir (beabsichtigt) NICHT.
Nun habe ich ja den String "str" mit einer Konstanten initialisiert, die automatisch in ein Array umgewandelt wird.
Das habe ich mit dem Zeiger auf int auch versucht; das geht aber nicht.
Aus welchem Grund? (Jetzt verzichten wir mal auf die Ausgabe)

Und außerdem noch etwas:
Code:
void main(void)
{
	char *chr;
	int  *zahl;

	chr = "character";
	zahl = 3;

	printf("Character: %c\n", chr);
	printf("Zahl: %i\n", zahl);
	getchar();

}

Der Code funtkioniert auch nicht, da man den Zeiger entweder mit new oder malloc Speicher zuweisen muss. Warum muss ich aber das für einen String nicht tun? chr ist doch auch nur ein Zeiger?
 
"Funktioniert nicht" interpretiere ich mal als compiliert nicht,denn das tut der Code nicht. Also...
str = "Test" funktioniert weil die Zeichenkette "Test" einen Platz im Speicher besitzt und str auf den Anfang der Zeichenkette gesetzt wird. "Test" symbolisiert also für den Compiler eine Speicheradresse.
Die Zuweisung über den {} Operator funktioniert nur bei statischen Arrays. Der Compiler scheint zunächst lediglich den Variablentyp zu betrachten. Da für ihn kein dynamisches Array sondern lediglich ein int* vorliegt, ist es für ihn eine Zuweisung von int zu int*, die nicht funktioniert. Im nächsten Schritt scheint er dann nach dem [ ] Operator zu schauen (versuch mal zahl als int zu deklarieren, der Datentyp passt dem Compiler dann, dafür sind es "zu viele Initialisierungen") str = {'T','e','s','t',0} funktioniert bspw. auch nicht, wenn str vom Typ char* ist.
zahl = 3 funktioniert nicht, weil es eine Zuweisung von int zu int* ist, die so nicht kompatibel ist. Also entweder einen Index angeben oder dereferenzieren:
zahl[0] = 3 oder *zahl = 3.
 
Original geschrieben von Dudadida
"Funktioniert nicht" interpretiere ich mal als compiliert nicht,denn das tut der Code nicht. Also...
str = "Test" funktioniert weil die Zeichenkette "Test" einen Platz im Speicher besitzt und str auf den Anfang der Zeichenkette gesetzt wird.

Der Speicher dafür wird automatisch Reserviert?

Warum muss ich ihn z.B. in diesem Fall nicht selber mit new oder malloc reservieren?
 
Warum sollte man? Eine statische Zeichenkette wie "Test" ist doch genauso abzählbar und konstant wie die Größe eines ints o.a. Das Ganze wird im Data Bereich der EXE abgehandelt. Wenn du dich ein bisschen mit Assembler beschäftigst, wirst du das besser verstehen. Im Databereich kann man mehr oder weniger beliebig Bytes reservieren (oder besser "belegen"), aber eben nur statisch vor der Laufzeit. Bspw. kann man eine Zeichenfolge konstanter Länge etc. dort reinpacken oder eben Variablen (word, double word,...).
 
Zurück