sayso Geschrieben 28. Oktober 2005 Teilen Geschrieben 28. Oktober 2005 hallo, mal kurz eine frage zu den variablentyen: char test[20] => dann habe ich ein char array in das ich 20 zeichen stellen kann, jedes zeichen einzel ansprechbar char test => eine variable mit einem zeichen oder? char *test => Zeiger auf Inhalt eines Speicherbereich Wenn ich die variable als zeiger definiere, kann ich ja einen mehr als 1 zeichen in die variable stellen. z.B so:. char *test = ""; test = "ich bin eine testvariable";. Und nun die Frage: Wieviel Zeichen kann ich in die Variable test stellen wenn sie vorher als zeiger definiert worden ist? Gibt es da auch ne Begrenzung (bestimmt?!). Danke! Gruß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carstenj Geschrieben 28. Oktober 2005 Teilen Geschrieben 28. Oktober 2005 Hallo, Wieviel Zeichen kann ich in die Variable test stellen wenn sie vorher als zeiger definiert worden ist? Gibt es da auch ne Begrenzung (bestimmt?!). ja: warning: string length `600' is greater than the length `509' ISO C89 compilers are required to support Du darfst den String aber nicht verändern, weil das undefiniertes Verhalten erzeugt. D. h. was einmal da drin steht, steht drin, für den Rest des Programms. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 28. Oktober 2005 Teilen Geschrieben 28. Oktober 2005 Dein Beispiel ist so im Prinzip falsch. Da test nur ein Zeiger ist musst du diesen entweder auf eine andere Variable zeigen lassen, oder dir selber Speicherplatz reservieren und den Zeiger darauf zeigen lassen. Ich hab das aber gerade auch mal so wie du ausprobiert und es scheint zu funktionieren. Deshalb gehe ich davon aus das der Compiler das intern in sowas umwandelt: char *test; char test2[] = "teeeeeest"; test = test2; [/PHP] Dabei könntest du einen beliebig langen String angeben. Ich persöhnlich würde dir aber nicht empfehlen das so wie du es gemacht hast zu machen Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
sayso Geschrieben 28. Oktober 2005 Autor Teilen Geschrieben 28. Oktober 2005 Hallo, ja: warning: string length `600' is greater than the length `509' ISO C89 compilers are required to support Du darfst den String aber nicht verändern, weil das undefiniertes Verhalten erzeugt. D. h. was einmal da drin steht, steht drin, für den Rest des Programms. Hi, alles klar. wo hast du das mit der warning her? Aber ich kann doch den Inhalt des Speicherbereiches wieder initilaisieren mit test = ""; und wieder neu benutzen?! Wenn etwas drinsteht und ich schreibe drüber ist es klar, das es zu undefinierten verhalten kommen kann. hmmmm Ich persöhnlich würde dir aber nicht empfehlen das so wie du es gemacht hast zu machen im der unix programmierung finde ich aber viele solche beispiele... naja Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 28. Oktober 2005 Teilen Geschrieben 28. Oktober 2005 Aber ich kann doch den Inhalt des Speicherbereiches wieder initilaisieren mit test = ""; und wieder neu benutzen?! Wenn etwas drinsteht und ich schreibe drüber ist es klar, das es zu undefinierten verhalten kommen kann. Nein, du hast das Zeigerprinzip nicht richtig verstanden. Ein Zeiger ist immer 4 Byte groß (zumindest auf einem 32Bit System) und enthält nur eine Adresse, das ist alles. Wenn du nun sowas machst: char *test=""; [/PHP] Wird meiner Einschätzung nach vom Compiler irgendwo fest Speicher reserviert um einfach einen Leerstring aufzunehmen, also eine binäre 0. Also im Prinzip wieder so was: [PHP] char *test; char test2[] = ""; test = test2; Das heißt du hast einmal 4 Byte für den Zeiger belegt und einmal 1 Byte für den Leerstring. Machst du nun sowas: test = "test"; [/PHP] wird nicht der Leerstring überschrieben, sondern es wird ein neuer String vom Compiler angelegt und test verweist nun darauf. Also sowas in der Art: [PHP] char *test; char test2[] = ""; test = test2; char test3[] = "test"; test = test3; D.h. du hast jetzt die 4 Byte für den Zeiger, 1 Byte für den Leerstring und 5 Byte für den andere String belegt. Ich hoffe das es dadurch etwas klarer wird, das es keinen Sinn macht Zeiger so zu benutzen. Um es noch etwas besser zu verdeutlichen mal ein gegenspiel wie man das bekommt was du willst: #include <stdio.h> #include <malloc.h> #include <string.h> int main() { char *test = NULL; // Zeiger initialisieren test = (char*)malloc(5 * sizeof(char)); //Platz für 5 Zeichen reservieren strcpy(test,"test"); //4 Zeichen + binäre 0 in reservierten Speicher kopieren printf ("%s\n",test); test = (char*)realloc(test,12 * sizeof(char)); //Speicher auf 12 Zeichen erweitern strcpy(test,"Langer Test"); // 11 Zeichen + binäre 0 in Speicher kopieren printf ("%s\n",test); free(test); // Speicher wieder freigeben WICHTIG!! return 0; } [/PHP] Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
sayso Geschrieben 28. Oktober 2005 Autor Teilen Geschrieben 28. Oktober 2005 Nein, du hast das Zeigerprinzip nicht richtig verstanden. Ein Zeiger ist immer 4 Byte groß (zumindest auf einem 32Bit System) und enthält nur eine Adresse, das ist alles. Wenn du nun sowas machst: char *test=""; [/PHP] Wird meiner Einschätzung nach vom Compiler irgendwo fest Speicher reserviert um einfach einen Leerstring aufzunehmen, also eine binäre 0. Also im Prinzip wieder so was: [PHP] char *test; char test2[] = ""; test = test2; Das heißt du hast einmal 4 Byte für den Zeiger belegt und einmal 1 Byte für den Leerstring. Machst du nun sowas: test = "test"; [/PHP] wird nicht der Leerstring überschrieben, sondern es wird ein neuer String vom Compiler angelegt und test verweist nun darauf. Also sowas in der Art: [PHP] char *test; char test2[] = ""; test = test2; char test3[] = "test"; test = test3; D.h. du hast jetzt die 4 Byte für den Zeiger, 1 Byte für den Leerstring und 5 Byte für den andere String belegt. Ich hoffe das es dadurch etwas klarer wird, das es keinen Sinn macht Zeiger so zu benutzen. Hi, ok wenn es so ist macht es keinen Sinn... voraussgesetzt der Compiler gibt das 1 Byte für den Leestring nicht mehr frei. Soll heissen. Ich sollte es lieber so machen: char test[]="ich bin eine testvariable"; char *testz = test; richtig? ist zwar umständlicher und nicht so "angenehm". aber wenn der compiler das 1 byte nicht mehr sauber frei gibt... macht es sinn... noch ne kurze frage: gebe ich keine anzahl in der [] an wieviel allokiert er dann? also bei char test[]="ich bin eine testvariable"; nimmt er dann die maximale byte anzahl oder nur die benötigten für die zeichen? danke Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 28. Oktober 2005 Teilen Geschrieben 28. Oktober 2005 richtig? ist zwar umständlicher und nicht so "angenehm". aber wenn der compiler das 1 byte nicht mehr sauber frei gibt... macht es sinn... doch der Speicher würde freigegeben werden weil dieser auf dem Stack angelegt wird. Ich hab dir aber oben noch ein Beispiel mit angefügt. noch ne kurze frage: gebe ich keine anzahl in der [] an wieviel allokiert er dann? also bei char test[]="ich bin eine testvariable"; nimmt er dann die maximale byte anzahl oder nur die benötigten für die zeichen? ) Nur die benötigten. Die maximal Verfügbaren wäre sehr sehr groß Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carstenj Geschrieben 28. Oktober 2005 Teilen Geschrieben 28. Oktober 2005 Hi, Deshalb gehe ich davon aus das der Compiler das intern in sowas umwandelt: char *test; char test2[] = "teeeeeest"; test = test2; Wieso sollte er das tun? Das sind zwei verschiedene Dinge. In deinem Beispiel zeigt der Zeiger test auf das erste Element von test2, also dem t. Ab da kann ich einzelne Zeichen verändern. Das wäre erlaubt: test[3]='b'; Aber das ist nicht erlaubt: char *test; char test = "teeeeeest"; ... test[3]='b'; Also ist das nicht äquivalent, somit kann der Compiler da auch nix machen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 28. Oktober 2005 Teilen Geschrieben 28. Oktober 2005 ok wenn es so ist macht es keinen Sinn... voraussgesetzt der Compiler gibt das 1 Byte für den Leestring nicht mehr frei.Stringliterale habens statische Lebensdauer, brauchen also nicht freigegeben zu werden. Die sind da, solange das Programm läuft. Soll heissen. Ich sollte es lieber so machen: char test[]="ich bin eine testvariable"; char *testz; testz = test; richtig?Solange dir klar ist, dass testz jetzt auf das Array test zeigt. Kopiert wird da nichts, wenn du testz änderst, änderst du auch test. Immerhin darfst du das. gebe ich keine anzahl in der [] an wieviel allokiert er dann?Anzahl der Zeichen im Literal plus eins für das Nullzeichen. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
sayso Geschrieben 28. Oktober 2005 Autor Teilen Geschrieben 28. Oktober 2005 doch der Speicher würde freigegeben werden weil dieser auf dem Stack angelegt wird. Ich hab dir aber oben noch ein Beispiel mit angefügt. Nur die benötigten. Die maximal Verfügbaren wäre dein kompletter Speicherplatz ok mit malloc ist es natürlich am saubersten Danke.. jetzt hat sich für mich das Mysterium auch geklärt Mit kompletten Platz meinte ich die 509 Zeichen Solange dir klar ist, dass testz jetzt auf das Array test zeigt. Kopiert wird da nichts, wenn du testz änderst, änderst du auch test. Immerhin darfst du das. Ja das ist klar.. aber die methode die ich aufrufen will erwatet einen zeiger Und was ist nun mit dem freigeben? Wird er nun freigegeben oder nicht ... Guybrush meinte er wird und Klotzkopp meint nicht Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Guybrush Threepwood Geschrieben 28. Oktober 2005 Teilen Geschrieben 28. Oktober 2005 Wieso sollte er das tun? Das sind zwei verschiedene Dinge. Ich hab mich etwas undeutlich ausgedrückt. Ich meinte nicht genau sowas, sondern etwas ähnliches. Das Beispiel sollte dazu dienen zu verdeutlichen das es jedesmal verschiedene Speicherbereiche sind auf die test zeigt. @sayso Es wird automatisch beim Beenden des Programms bzw beim verlassen der Funktion freigegeben wenn du sowas machst: char test[] = "test"; [/PHP] nur wenn du dir selber Speicher reservierst, mit malloc, calloc oder sonstwas dann musst du den selber wieder freigeben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
sayso Geschrieben 28. Oktober 2005 Autor Teilen Geschrieben 28. Oktober 2005 Ich hab mich etwas undeutlich ausgedrückt. Ich meinte nicht genau sowas, sondern etwas ähnliches. Das Beispiel sollte dazu dienen zu verdeutlichen das es jedesmal verschiedene Speicherbereiche sind auf die test zeigt. @sayso Es wird automatisch beim Beenden des Programms bzw beim verlassen der Funktion freigegeben wenn du sowas machst: char test[] = "test"; [/PHP] nur wenn du dir selber Speicher reservierst, mit malloc, calloc oder sonstwas dann musst du den selber wieder freigeben. ok aber was ist mit der char *test = "dies ist ein test" lösung/möglichkeit? Wird es das byte nun freigegeben oder nicht? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 28. Oktober 2005 Teilen Geschrieben 28. Oktober 2005 ok aber was ist mit der char *test = "dies ist ein test" lösung/möglichkeit? Wird es das byte nun freigegeben oder nicht? Da hast du nur einen Zeiger auf ein Literal, da gibt es nichts freizugeben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
sayso Geschrieben 28. Oktober 2005 Autor Teilen Geschrieben 28. Oktober 2005 Da hast du nur einen Zeiger auf ein Literal, da gibt es nichts freizugeben. na bei der array erklärung von guy ist es aber so dargestellt... hier nochma der quote wird nicht der Leerstring überschrieben, sondern es wird ein neuer String vom Compiler angelegt und test verweist nun darauf. Also sowas in der Art: char *test; char test2[] = ""; test = test2; char test3[] = "test"; test = test3; Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carstenj Geschrieben 28. Oktober 2005 Teilen Geschrieben 28. Oktober 2005 Hi, und was verstehst du jetzt daran nicht? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
sayso Geschrieben 28. Oktober 2005 Autor Teilen Geschrieben 28. Oktober 2005 Hi, und was verstehst du jetzt daran nicht? ob das eine byte von char test2[] = ""; freigegeben wird wenn ich es mit der "ungeschickten lösung" *char = "dies ist ein test" mache oder nicht... das war irgendwie unklar... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carstenj Geschrieben 28. Oktober 2005 Teilen Geschrieben 28. Oktober 2005 Es muss nirgendwo was freigegeben werden. Nirgendwo. Es sei denn, du benutzt malloc und free, aber das wurde doch schon erklärt. Das Stringliteral wird irgendwo im Binary gespeichert, und bei Abruf wird an die Stelle gesprungen. Wenn ich mir mein auf Linux produziertes Binärfile angucken (alle Strings extrahiere) sieht das so aus: /lib/ld-linux.so.2 libc.so.6 printf _IO_stdin_used __libc_start_main __gmon_start__ GLIBC_2.0 PTRh0 QVh< dieser text steht in einem Array Dies ist ein Test Die letzten beiden sind meine Literale, die ich im Quellcode erzeugt habe. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 28. Oktober 2005 Teilen Geschrieben 28. Oktober 2005 ob das eine byte von char test2[] = ""; freigegeben wirdtest2 ist ein Array mit automatischer Lebensdauer, d.h. das Array wird zerstört, wenn das Programm den Scope verlässt, in dem die Variable definiert ist. Das Literal, das für die Initialisierung benutzt wird, hat statische Lebensdauer - wie alle Stringliterale. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
sayso Geschrieben 28. Oktober 2005 Autor Teilen Geschrieben 28. Oktober 2005 Es muss nirgendwo was freigegeben werden. Nirgendwo. Es sei denn, du benutzt malloc und free, aber das wurde doch schon erklärt. Das Stringliteral wird irgendwo im Binary gespeichert, und bei Abruf wird an die Stelle gesprungen. Wenn ich mir mein auf Linux produziertes Binärfile angucken (alle Strings extrahiere) sieht das so aus: /lib/ld-linux.so.2 libc.so.6 printf _IO_stdin_used __libc_start_main __gmon_start__ GLIBC_2.0 PTRh0 QVh< dieser text steht in einem Array Dies ist ein Test Die letzten beiden sind meine Literale, die ich im Quellcode erzeugt habe. ich weiss das ICH es nicht machen muss. da der compiler das alles selbst regelt solange ich keine alloc kommandos verwende. mich hat es halt nur interessiert Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
sayso Geschrieben 29. Oktober 2005 Autor Teilen Geschrieben 29. Oktober 2005 So nochmal ich Habe jetzt die Lösung gefunden warum auch mein anfangscode funktioniert hat: char *test; Die Lösung steht hier: http://home.fhtw-berlin.de/~junghans/cref/CONCEPT/string.html Das man ihn dann nicht ändern kann da er zu einer Konstanten wird, ist klar... ansonsten mit malloc arbeiten Noch ne kurze Frage: Beim Übergeben von char Zeigern gibt es doch ne besonderheit? Hab mal was gelesen das etwas kopiert oder auch nicht kopiert wird, finde es blos nicht mehr :-\ Aber einer von euch weiss das doch bestimmt Welche besonderheit hat char? Und noch eins: char *test = "Testmessage"; printf("%s",test); Obiger Beispielcode gibt mir ja "Testmessage" aus. Warum muss ich hier nicht zwingend "printf("%s",*test);" schreiben? Denn so würde doch erst auf den Wert de Speicheradresse verwiesen oder? Oder regelt das die "printf funktion" und sieht das es ein zeiger auf ein Literal ist und interpretiert dann richtig? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
sayso Geschrieben 29. Oktober 2005 Autor Teilen Geschrieben 29. Oktober 2005 So ein Update. Ich habe ein bischen getestet und folgendes: char *test = "Testmessage"; printf("%s",*test); Bringt einen Speicherzugriffsfehler... ist mir jetzt auch klar warum... kein erklärungsbedarf mehr char *test = "Testmessage \n"; printf("%s",test); test = "muhh \n"; printf("%s",test); Gibt mir folgendes aus: Testmessage muhh D.h. ich kann auch test ändern und brauche dazu nicht unbedingt den malloc. Irgendwie bin ich jetzt total konfus. Ich dachte wenn man mit char *test arbeitet ist es eine konstante... Könnte das jetzt mal jemand richtig stellen, wann ich was brauche und warum? Denn ich sehe jetzt ehrlich nicht mehr den Sinn hinter den malloc.... wenn ich auch alles mit char *test machen kann... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carstenj Geschrieben 29. Oktober 2005 Teilen Geschrieben 29. Oktober 2005 Hi, Habe jetzt die Lösung gefunden warum auch mein anfangscode funktioniert hat: das wurde dir ungefähr über 2 Seiten erklärt. D.h. ich kann auch test ändern und brauche dazu nicht unbedingt den malloc. Du solltest dir evtl. mal ein Buch kaufen. Ich empfehle das hier: http://www.amazon.de/exec/obidos/ASIN/3446154973 Irgendwie bin ich jetzt total konfus. Ich dachte wenn man mit char *test arbeitet ist es eine konstante... Der Zeiger zeigt auf eine Konstante, d. h. das, auf was er zeigt, kann nicht verändert werden. Du kannst aber natürlich den Zeiger auf etwas anderes zeigen lassen, was du in deinem Beispiel machst. Wenn du auch das nicht willst, schau dir mal, wie man const einsetzt. EDIT: Das %s in printf sorgt dafür, dass alle Zeichen bis zum \0 auf die Standardausgabe ausgegeben werden. char *test = "test" Das sind nicht 4 Zeichen, sondern 5, weil hinter dem letzten t noch ein \0 steht. Diese Null steht für das Ende des Strings. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
sayso Geschrieben 29. Oktober 2005 Autor Teilen Geschrieben 29. Oktober 2005 Der Zeiger zeigt auf eine Konstante, d. h. das, auf was er zeigt, kann nicht verändert werden. Du kannst aber natürlich den Zeiger auf etwas anderes zeigen lassen, was du in deinem Beispiel machst. Wenn du auch das nicht willst, schau dir mal, wie man const einsetzt. Hi, ok wenn man es so sieht, ist es logisch. wenn der zeiger durch ändern der Literale automatisch auch einen anderen Speicherbereich nimmt (= auf etwas anderes zeigt), dann erklärt sich auch warum man es ändern kann.. Für mich war der Begriff "Konstante", ein wirklich konstanter Wert der nicht verändert werden kann. Wird der alte Speicherbereich eigentl. automatisch wieder freigegeben (ohne beendigung des programms oder ohne verlassen von funktionen in der der zeiger verwendet wird) wenn der Zeiger "umgebogen" wird, oder bleibt der speicherbereich allokiert bis das programm oder die funktion verlassen wird. Und letzte Frage: Welche Besonderheit gibt es bei Char zeigern und übergaben? Ich dachte einmal das ich etwas gelesen habe, das irgendwas nicht kopiert wird. Finde es aber nicht mehr oder liege ich da falsch... Es ist das erste mal das ich in diesem Umfang mit Zeigern auf char Variablen arbeite, deswegen die Verständnisprobleme.... Ich fasse zusammen: * malloc verwende ich wenn ich wirklich zeichen innerhalb eines literals ändern will * die char *variable lösung kann ich verwenden wenn ich den Literal nicht editieren will aber vllt. irgendwann mal einen anderen wert in der variable stehen haben will... @ carsten j: habe mal ein kleines beispiel programm geschrieben, aber hier sehe ich das trotzdem die gleiche speicheranfangsadresse verwendet wird. wie meinst du das dann das zeiger auf etwas anderes zeigt? #include "stdafx.h" #include <stdio.h> int main(int argc, char* argv[]) { char *test; test = "test 1"; printf ("1. test char: %s \n",test); printf ("1. Speicherbereich von char: %d \n", &test); test = "test 2"; printf ("2. test char: %s \n",test); printf ("2. Speicherbereich von char: %d \n", &test); return 0; } hier die ausgaben: 1. test char: test 1 1. Speicherbereich von char: 1245052 2. test char: test 2 2. Speicherbereich von char: 1245052 Press any key to continue Danke füre eure Antworten bis hier her Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
carstenj Geschrieben 30. Oktober 2005 Teilen Geschrieben 30. Oktober 2005 Hi, Wird der alte Speicherbereich eigentl. automatisch wieder freigegeben (ohne beendigung des programms oder ohne verlassen von funktionen in der der zeiger verwendet wird) wenn der Zeiger "umgebogen" wird, oder bleibt der speicherbereich allokiert bis das programm oder die funktion verlassen wird. Lies dir mal die Beiträge durch, die bisher dazu geschrieben wurden. Ich denke das Thema ist mittlerweile zur Genüge durchgekaut worden.... habe mal ein kleines beispiel programm geschrieben, aber hier sehe ich das trotzdem die gleiche speicheranfangsadresse verwendet wird. wie meinst du das dann das zeiger auf etwas anderes zeigt? Wenn du die Adresse haben willst, auf die ein Zeiger zeigt, solltest du auf die Adresseoperatoren (&) verzichten: ... printf ("1. Speicherbereich von char: %d \n", test); ... printf ("2. Speicherbereich von char: %d \n", test); ... Welche Besonderheit gibt es bei Char zeigern und übergaben? Ich dachte einmal das ich etwas gelesen habe, das irgendwas nicht kopiert wird. Finde es aber nicht mehr oder liege ich da falsch... Was meinst du genau? Verstehe ich nicht so ganz... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 30. Oktober 2005 Teilen Geschrieben 30. Oktober 2005 wenn der zeiger durch ändern der Literale automatisch auch einen anderen Speicherbereich nimmt (= auf etwas anderes zeigt), dann erklärt sich auch warum man es ändern kann..In dem Code wird kein Literal geändert. Dein Zeiger ist wie ein Stück Papier, auf dem du mit Bleistift eine Adresse notierst. Für mich war der Begriff "Konstante", ein wirklich konstanter Wert der nicht verändert werden kann. Wie gesagt, mit Bleistift. Du kannst das jederzeit ausradieren und eine andere Anschrift aufschreiben. Das heißt aber nicht, dass du damit irgendwie das Haus beeinflussen kannst, das an der Adresse steht. Wird der alte Speicherbereich eigentl. automatisch wieder freigegeben (ohne beendigung des programms oder ohne verlassen von funktionen in der der zeiger verwendet wird) wenn der Zeiger "umgebogen" wird, oder bleibt der speicherbereich allokiert bis das programm oder die funktion verlassen wird.Wird irgendein Haus abgerissen, oder zieht jemand um, nur weil du auf deinem Zettel eine andere Adresse aufschreibst? Ob du einen Zeiger an eine andere Stelle zeigen lässt, hat auf den allozierten Speicher überhaupt keinen Einfluss. Welche Besonderheit gibt es bei Char zeigern und übergaben? Ich dachte einmal das ich etwas gelesen habe, das irgendwas nicht kopiert wird. Finde es aber nicht mehr oder liege ich da falsch...Es ist da wie mit allen Zeigern. Der Zeiger wird kopiert, nicht das, worauf er zeigt. Es ist das erste mal das ich in diesem Umfang mit Zeigern auf char Variablen arbeite, deswegen die Verständnisprobleme....Ich glaube, es ist das erste mal, dass du überhaupt mit Zeigern arbeitest. Vielleicht solltest du nicht gerade mit char-Zeigern anfangen, weil die nunmal eine Sonderbehandlung bekommen. * malloc verwende ich wenn ich wirklich zeichen innerhalb eines literals ändern willNein. Malloc verwendest du, wenn du eine Lebensdauer über den Scope hinweg haben willst oder die Größe eines Arrays erst zur Laufzeit kennst. * die char *variable lösung kann ich verwenden wenn ich den Literal nicht editieren will aber vllt. irgendwann mal einen anderen wert in der variable stehen haben will...Ich glaube, dir ist nicht ganz klar, was Literal bedeutet. Ein Literal ist eine Konstante in deinem Quellcode. Es gibt in C Ganzzahl-, Fließkomma-, Zeichen- und Zeichenkettenliterale. Zeichenkettenliterale sind die einzigen, von denen du überhaupt eine Adresse bekommen kannst. Du kannst aber den Inhalt nicht über diese Adresse ändern, ohne undefiniertes Verhalten zu erzeugen. habe mal ein kleines beispiel programm geschrieben,In Ergänzung zu carstenjs Antwort: In deinem Programm gibst du die Adresse der Zeigervariablen aus, nicht die Adresse, auf die der Zeiger zeigt. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.