Unterschied zwischen Zeiger und Array beim einlesen eines Strings



  • 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



  • @CStoll:

    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
    wax

    wie 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.
    🙂


Anmelden zum Antworten