Anfängerfrage | Pointer

BaseUser

Ensign
Registriert
Feb. 2005
Beiträge
200
Hallo,

eine Weitere Anfängerfrage...

Kann mir jemand sagen, warum dass

Code:
#include <stdio.h>

main()
{
	char *text = "Hallo";

	*text++; 
	*text = '#'; 
	*text--;

	printf("%s \n",text); 

}

nicht funktioniert?

Also gedacht war es so: Ich habe den Text 'Hallo', bei der letzten Druckausgabe sollte aber 'H#llo' ausgegeben werden.

Bei der Anweisung

*text = '#';

stürzt das Programm leider ab... warum?

Ich habe doch den Pointer um 1 Stelle erhöht, sage ihm, dass er dort das '#' reinschreiben soll, und erniedrige ihn dann wieder um 1 Stelle für die Ausgabe - wo liegt denn der Fehler? :)

Über Hilfe würde ich mich wie immer freuen!!
 
Es muss nicht "*text++;" lauten, sondern "text++;". Die Variable Text ist ein Zeiger und nur diesen willst du ja erhöhen, um auf das zweite Zeichen Zugriff zu bekommen. Willst du hingegen den Inhalt dieser Zeigeradresse verändern (also die Raute hineinschreiben), dann musst du das Sternchen (zur sog. Dereferenzierung) voransetzen.
 
Danke erst mal - du meinst so?

Code:
#include <stdio.h>

main()
{
	char *text = "Hallo";

	text++; 
	*text = '#'; 
	text--;

	printf("%s \n",text); 

}

Es passiert aber leider das gleiche, also Absturz...

Wie gesagt, am Schluss sollte 'H#llo' ausgegeben werden.
 
Wo genau stürzt das Programm denn jetzt ab? Kannst du durch den Debugger die genaue Zeile herausfinden? Ich kann nämlich im Moment keinen Fehler erkennen (höchstens eine "Unschönheit": Du solltest für die main-Funktion explizit den Rückgabetyp int definieren und dann als letzte Anweisung nach dem printf "return 0;" schreiben).
 
@ph4nt0m - danke für den Tip; ich habe die Schönheitsfehler ausgebessert - leider immer noch das gleiche....

Wenn ich die Zeile

*text = '#';

auskommentiere, funktioniert alles einwandfrei.

Auch der Debugger zeigt mir die Zeile als "Problem" an. Hier ein Screenshot:

hc_001.jpg


Hat jemand noch ein Tip...? :)
 
Vor das "main(void)" bitte noch ein int schreiben, dann ist das schonmal perfekt ;)
Wie genau äußert sich denn eigentlich der Fehler? Ich kann auf dem Bild keine Meldung oder dergleichen erkennen. Zumindest die Erhöhung des Zeigers hat funktioniert (siehe unten links "allo"). Woher kommt denn überhaupt dieser Breakpoint? Hast du den gesetzt?

Hast du dein Programm im Debug-Modus kompiliert?
 
Hi,

also erstmal
PHP:
char *text = "Hallo";
nicht machen. Schreib doch paar zeilen mehr Code, was das etwas verständlicher macht. Schon klappt es:

PHP:
#include <stdio.h>

int main(int argc, char *argv[])
{
    
    char text[] = "Hallo"; //Hast einen char was "Hallo" als Inhalt hat
    char *p;                    //Erstellt einfach einen charpointer der momentan NICHTS macht

    p = text;                   //Zuweisung: charpointer zeige auf text (erste stelle, also auf H)

    p++;                         //Gehe eine Stelle weiter, also zeige auf a
    *p = '#';                   //Dahin wo hingezeigt wird soll jetzt "#" stehen

   printf("%s \n",text); 
   return 0;
}

Fertig und Code funktioniert.

Gruß

Edit: C + Debugen + Fehlermeldungen verstehen ist etwas unmögliches ;)

PS. Eclipse + C => Crap (gut liegt eventuell daran, dass ich alles hasse was in Java geschrieben wurde - nicht all zu sehr beachten, ist nur eine unnötig blöde persönliche Meinung von mir ;) )

Edit 50#: Ok nach 50 mal beartet, JETZT gilt es, so lesen
 
Zuletzt bearbeitet:
Gegen Kommentare ist ja nichts einzuwenden, aber in diesem Fall hilft es nicht viel, weil man nicht sehen kann, wo (rein funktional) der Unterschied zwischen deinem und BaseUsers code ist. Wenn du den Fehler in seinem Code gefunden hast, dann bennene diesen doch bitte noch einmal ausdrücklich.

Außerdem handelt es sich bei der IDE mit an Sicherheit grenzender Wahrscheinlichkeit nicht um Eclipse, sondern mit Visual Studio.
 
@ph4nt0m

Naja, die Fehlermeldung war:

"Die Anweisung in "0x004113d1" verweist auf Speicher in "0x00415745". Der Vorgang "written" konnte nicht auf dem Speicher durchgeführt werden."

@ReVo
Vielen Dank für die Ausführliche Beschreibung! Ich habe das Programm geändert - jetzt funktioniert es! Danke, das hat mir sehr geholfen! :)
 
Sehr merkwürdig das Ganze. Ich habe deinen ursprünglichen Code jetzt bestimmt doppelt und dreifach durchgelesen und kann mir nicht erklären, warum der nicht genau so funktionieren sollte, wie der neue. Aber wenn es dir nur auf das Ergebnis bzw. ein funktionierendes Programm ankommt, ist das wahrscheinlich nicht weiter interessant für dich ;)
 
@ph4nt0m: Hi,

stimmt, wenn ich genau hingucke... sieht doch aus wie VS, das alte Drecksding ^^. Dachte VS kann nur Visual C++ und kann kein C. Wie auch immer, was ich sagen wollte ist, dass wenn man die C grundlagen richtig lernen will einfach mit Texteditor rangehen ;) - Bzw unter Linux einfach mit Kate oder VI , aber gut ich lehne mich ausm Fenster.

Pointer sind eine dreckige Sache, ich muss auch immer rumprobieren, kann es momentan garnicht richtig erklären. Ich weiß nur, dass das auf dem ersten blick sofort schlecht aussah und ich das so nicht machen würde. Hab da ne vermutung, aber ich probier mal selber rum und schreibe eine ausführliche Erklärung dazu :) (mit Diagrammen, Statistiken, Videos, 50 seitige Unterlagen... :P )- weil eine kleine Sachen verstehe ich gerade auch nicht.

Gruß
 
@all

jap, ist VS, Version 2008.

@ph4nt0m

ja, ich dachte eigentlich auch, dass es das selbe bedeutet! Salopp gesagt; ich dachte das der Pointer in dem Fall

*text = "bla bla";

eigentlich die Startadresse des Arrays enthält. Aber da habe ich wohl falsch gedacht...

@ReVo

ja, du hast schon recht - Kate ist für Anfänger empfehlenswert; aber das mit dem Debuggen ist halt schon was feines :D
Ergänzung ()

Nachtrag:

<Offtopic>

Intel Pentium III @ 500MHz - 128MB RAM - RIVA TNT2 - System1: Windows 98SE 32Bit System2: Debian 2.0 Hamm

@Revo: ist das deine Hauptmaschine? Nur so aus Neugier - Aldi? :)

</Offtopic>
 
BaseUser schrieb:
@ph4nt0m

ja, ich dachte eigentlich auch, dass es das selbe bedeutet! Salopp gesagt; ich dachte das der Pointer in dem Fall

Nein! Bei

Code:
char *text = "Hallo";

handelt es sich um einen Zeiger vom Typ char auf einen konstanten String! Hier wird aber nicht Speicher für den String allokiert. Das Wort "Hallo" ist eine Konstante, die im Read-Only Speicher liegt.

Wenn du nun versuchst schreibend auf das Wort zuzugreifen, stürzt dein Programm mit hoher Wahrscheinlichkeit ab.

Bei

Code:
char text[] = "Hallo";

wird dagegen Speicher reserviert und dieser wird mit den Zeichen gefüllt.

Dein Code müsste korrekt so aussehen.

Code:
#include <stdio.h>

int main()
{
    char text[] = "Hallo";

    *(text + 1) = 'e';
    printf("%s \n", text); 

    return 0;
}

Das ändert z.B. den zweiten Buchstaben. Statt mit Zeigern, kann man auch einfach text[1] schreiben.
 
Danke für deine Erklärung, das war mir bisher tatsächlich nicht bewusst. Ich bin die ganze Zeit davon ausgegangen, dass die Variable text auch im Fall des Arrays letztendlich nur ein Zeiger ist (was auch ja so auch stimmt) und die - wenn auch unkonventionelle - Schreibweise direkt als Zeiger dann letztendlich das gleiche bedeuten müsste. Aber wie du gesagt hast, liegt der Unterschied eben bei der Art und Weise, wie bzw. wo der eigentliche Inhalt der Zeichenkette abgelegt wird.
 
@Stefan_Sch

DAS sollte des Rätsels Lösung sein!!

Daher auch die Fehlermeldung

"Die Anweisung in "0x004113d1" verweist auf Speicher in "0x00415745". Der Vorgang "written" konnte nicht auf dem Speicher durchgeführt werden."

Vielen Dank für die Erklärung!!
Ergänzung ()

@ph4nt0m

Ich bin die ganze Zeit davon ausgegangen, dass die Variable text auch im Fall des Arrays letztendlich nur ein Zeiger ist (was auch ja so auch stimmt) und die - wenn auch unkonventionelle - Schreibweise direkt als Zeiger dann letztendlich das gleiche bedeuten müsste.

Jap, genau das habe ich auch gedacht und mich dann bei der Ausführung stark gewundert... :D
 
Zurück
Oben