Unterschied zwischen Zeiger und Array beim einlesen eines Strings
-
Hallöchen,
ich fange gerade wieder an meine C-Kentnisse aufzufrischen und stehe nun vor einer Frage.
Wenn ich folgenden Code schreibe:
char testString[10]; scanf("%s", testString); printf("%s", testString); return 0;
funktioniert alles. Wenn ich aber nun anstelle des Arrays nen Zeiger angebe, funzt es nicht mehr:
char *testString; scanf("%s", testString); printf("%s", testString); return 0;
Wieso stürzt dieses Programm ab? Ich dachte immer das der Name eines Arrays genau so wie ein Zeiger, auch nur für eine Speicheradresse steht.
Muss ich im 2. Fall vielleicht selbst Speicher frei machen?MfG
wax
-
speicher mit
testString = malloc(<buffer größe>);
allozieren. ein
char testString[10];
macht dieses schon statisch.
-
An die Funktionen wird in beiden Fällen eine Adresse übergeben, die sie als Startpunkt zum Lesen und Schreiben verwenden. Der Unterschied besteht darin, was an der adressierten Speicherstelle liegt - im ersten Fall liegt dort das Array (mit genug Platz für 9 Zeichen und Stringende-Marke*), im zweiten Fall hast du einen nicht initialisierten Zeiger, der irgendwo in den RAM verweist (vermutlich an Stellen, auf die dein Programm keinen Zugriff hat).
Das zweite Beispiel würde auch funktionieren, wenn du den Zeiger vor der Verwendung vernünftig initialisieren würdest:
char* testString = malloc(10); scanf("%s", testString); printf("%s", testString); return 0;
* Wenn du eine längere Antwort eingibst, bekommst du auch mit dem ersten Beispiel Probleme (allerdings meist etwas subtilere).
-
Vielen Dank,
nun ist alles klar.
MfG
wax
-
Der Zeiger, welcher mit malloc verwendet wird, sollte dann aber auf void und nicht auf char zeigen, oder?
MfG
wax
-
wax schrieb:
Der Zeiger, welcher mit malloc verwendet wird, sollte dann aber auf void und nicht auf char zeigen, oder?
Nein, wieso? malloc() gibt zwar einen void* (Zeiger auf irgendwas) zurück, aber der ist technisch kompatibel zu einem beliebigen "regulären" Zeiger. Und da du mit Strings arbeiten willst, ist char* die erste Wahl für den Typ.
-
Also wenn ich folgenden Code verwende, meckert mein Compiler:
char *testString = malloc(5); scanf("%s", testString); printf("%s", testString); return 0;
Aussage: error C2440: 'Initialisierung': 'void *' kann nicht in 'char *' konvertiert werden
Sobald ich *testString auf void zeigen lasse, funktioniert es.
MfG
wax
-
weil du es sehr wahrscheinlich als c++ code kompilierst. da ist ein casten notwendig.
-
ok, ja ich habe es im VS 2005 als Win32-Konsolenanwendung angegeben. Da wird wohl von C++ ausgegangen.
Das stellt mir gleich ne neue Frage.
Welche IDE verwendet ihr? Als ich "damals" in C programmiert habe, habe ich DJGPP verwendet. Doch irgendwie gefiehl mir das alles nicht so richtig.MfG
wax
-
char *testString = (char*)malloc(5); . . . . free(testString);
-
wax schrieb:
ok, ja ich habe es im VS 2005 als Win32-Konsolenanwendung angegeben. Da wird wohl von C++ ausgegangen.
Das stellt mir gleich ne neue Frage.
Welche IDE verwendet ihr? Als ich "damals" in C programmiert habe, habe ich DJGPP verwendet. Doch irgendwie gefiehl mir das alles nicht so richtig.MfG
waxwie immer reine geschmacksache
unter windows verwende ich meistens immer noch
visual studio, aber zunehmend auch die mingw umgebung, da 64bit kompiler und
linker endlich schon zumindest im test stadium verfügbar sind. unter linux, nunja,
der gute alte editor und gcc
-
der gute alte editor und gcc
Ist das mit dem Editor bei größeren Projekten denn nicht vielleicht etwas zu "hardcore"?
-
auch ansichtsache. ich komme zum beispiel ganz gut mit Kate klar. solange
ich in der sidebar offene dateien verwalten kann, syntax-highlighting und
ein integriertes terminal habe fällt es mir eher leicht den überblick zu
behalten
-
sothis_ schrieb:
weil du es sehr wahrscheinlich als c++ code kompilierst. da ist ein casten notwendig.
nicht casten. ich würde vorschlagen, die datei von .cpp in .c umzubenennen. sonst könnte es sein, dass er noch mit anderen dubiositäten auf die nase fällt.