e.full Geschrieben 20. November 2008 Autor Geschrieben 20. November 2008 07: also enthält einen terminierten string die quelle ist str2, der quellzeiger zeigt auf den speicher, in das Ziel darf auch geschrieben werden und deshalb denke ich das das gültig ist bei 08: der Quellzeiger zeigt auf Speicher , aus dem gelesen werden darf, enthält einen terminierten string quelle ist test3, wird mit kopiert aber kein gültiger zugriff bei 09: der quellzeiger zeigt auf den speicher in das ziel darf geschrieben werden enthält einen terminierten string. deshalbt gültig Zitieren
e.full Geschrieben 20. November 2008 Autor Geschrieben 20. November 2008 ist das denn jetzt richtig wie ich das gemacht habe Zitieren
Klotzkopp Geschrieben 21. November 2008 Geschrieben 21. November 2008 07: also enthält einen terminierten string die quelle ist str2, der quellzeiger zeigt auf den speicher, in das Ziel darf auch geschrieben werden und deshalb denke ich das das gültig istHast du geprüft, ob der Zielspeicher auch groß genug ist? Das war doch das Problem in Zeile 6. bei 08: der Quellzeiger zeigt auf Speicher , aus dem gelesen werden darf, enthält einen terminierten string quelle ist test3, wird mit kopiert aber kein gültiger zugriffWarum? bei 09: der quellzeiger zeigt auf den speicher in das ziel darf geschrieben werden enthält einen terminierten string. deshalbt gültigWohin zeigt denn der Zielzeiger? Zitieren
e.full Geschrieben 21. November 2008 Autor Geschrieben 21. November 2008 bei 07: die quelle ist str.2 und hate eine länge von 8 in das zielspeicher dürfen 10bytes geschrieben werden 08:quelle ist str2 und hat eine länge von 8 in das zeilspecher dürfen 10bytes geschrieben werden 09: zielzeiger zeigt auf den speicher in den geschrieben werden darf ??? Zitieren
Klotzkopp Geschrieben 21. November 2008 Geschrieben 21. November 2008 bei 07: die quelle ist str.2 und hate eine länge von 8 in das zielspeicher dürfen 10bytes geschrieben werdenWie kommst du auf 8 und 10? 08:quelle ist str2 und hat eine länge von 8 in das zeilspecher dürfen 10bytes geschrieben werdenstr2 kommt in Zeile 8 überhaupt nicht vor. Ich bekomme langsam das Gefühl, du willst mich veralbern. 09: zielzeiger zeigt auf den speicher in den geschrieben werden darf Ja und woraus schließt du das? Zitieren
e.full Geschrieben 21. November 2008 Autor Geschrieben 21. November 2008 ehmm tut mir leid zeile 8 habe ich mich verguckt, die quelle ist test3 und 07: wir hatten ja gesagt das str1 der länge 5 ist in zeile 4 und str 2 3 in zeile 3 deshalb habe ich da jetzt 8 stehen Zitieren
Klotzkopp Geschrieben 21. November 2008 Geschrieben 21. November 2008 wir hatten ja gesagt das str1 der länge 5 ist in zeile 4 und str 2 3 in zeile 3 deshalb habe ich da jetzt 8 stehen Zum dritten Mal: strcpy ändert nichts an den Zeigern, es kopiert nur Inhalt durch die Gegend. Wenn str1 vorher auf einen Speicherbereich der Länge 5 gezeigt hat, tut es das auch hinterher. Zitieren
e.full Geschrieben 21. November 2008 Autor Geschrieben 21. November 2008 also ist str2 dann auch der länge 5 Zitieren
Klotzkopp Geschrieben 21. November 2008 Geschrieben 21. November 2008 also ist str2 dann auch der länge 5 Wie kommst du jetzt auf 5? Das Array str2 wurde in Zeile 2 mit einem Literal der Länge 3 initialisiert, und danach hat sich nie wieder etwas daran geändert. Zitieren
e.full Geschrieben 21. November 2008 Autor Geschrieben 21. November 2008 es tut mir sehr leid bin bisschen verwirrt, deshalb komme ich bisschen durcheinander. 07: stimmt in zeile 2 wurde str2 mit der länge 3 gesagt, aus diesem grund hat str3 jetzt auch eine länge von 3 aus diesem grund ist sie gültig, bei 08: vorher hatten wir gesagt das str3[0] länge 11, hier bin ich mir ehrlich zu sein nicht so sicher und bei 09: auch net so sehr Zitieren
Klotzkopp Geschrieben 21. November 2008 Geschrieben 21. November 2008 es tut mir sehr leid bin bisschen verwirrtIst das ein dauerhafter Zustand? 07: Stimmt in zeile 2 wurde str2 mit der länge 3 gesagt, aus diesem grund hat str3 jetzt auch eine länge von 3Zum vierten Mal: strcpy ändert nichts an den Zeigern. str3 kommt in dieser Zeile auch nicht vor. Selbst wenn es das täte, würde strcpy nichts daran ändern, wohin es zeigt, oder wie groß der Speicherbereich ist, auf den es zeigt. bei 08: vorher hatten wir gesagt das str3[0] länge 11,Soweit richtig. hier bin ich mir ehrlich zu sein nicht so sicher Es sind vier einfache und ganz klare Bedingungen, die du bei strcpy prüfen musst. Es kann doch nicht sein, dass dich das derart überfordert. Zum Beispiel für Zeile 8:Zeigt "test3" auf Speicher, aus dem gelesen werden darf?Enthält dieser Speicher einen terminierten String?Zeigt str3[0] auf Speicher, in den geschrieben werden darf?Ist dieser Speicher groß genug für den String (mit Terminierung)? Wenn die Antwort nicht vier mal "ja" ist, ist der Zugriff ungültig. Zitieren
e.full Geschrieben 21. November 2008 Autor Geschrieben 21. November 2008 also zu 08: die quelle test3 zeigt auf den speicher, aus dem gelesen werden darf dieser enthält einen terminierten string in ziel darf geschrieben werden, speicher is groß also wenn die bedingungen erfüllt sind, dann heisst es gültig Zitieren
Klotzkopp Geschrieben 21. November 2008 Geschrieben 21. November 2008 in ziel darf geschrieben werden, Erinnerst du dich noch daran, was alles nicht erlaubt ist? Schreibzugriffe auf Stringliterale gehören dazu. str3[0] verweist auf ein Stringliteral, da darf man nicht reinschreiben. Zitieren
e.full Geschrieben 21. November 2008 Autor Geschrieben 21. November 2008 ah dann ist das also wieder ein ungültiger zugriff Zitieren
e.full Geschrieben 21. November 2008 Autor Geschrieben 21. November 2008 so und jetzt zum letzten: 09: quelle str2 zeigt auf den speicher, aus dem gelesen werden darf terminierter string ist auch vorhanden str4 zeigt auf speicher, in den geschrieben werden darf speicher groß -> gültiger zugriff Zitieren
Klotzkopp Geschrieben 21. November 2008 Geschrieben 21. November 2008 Kann es sein, dass du einfach nur rätst, damit ich dir sage, ob es richtig oder falsch ist? Zitieren
e.full Geschrieben 21. November 2008 Autor Geschrieben 21. November 2008 wie kommen sie denn da drauf, ich verusche es so zu machen wie ich es verstehe. sonst lerne ich doch nix daraus Zitieren
unbenannt Geschrieben 21. November 2008 Geschrieben 21. November 2008 wie kommen sie denn da drauf, ich verusche es so zu machen wie ich es verstehe. sonst lerne ich doch nix daraus Verstehe bitte, dass Klotzkopp sein Bestes gibt, es Dir begreiflich zu machen - und das rein freiwillig, um es hoffentlich völlig unnötigerweise anzumerken. Du gehst jedoch reichlich "unsauber" darauf ein, sondern formulierst ständig gleich. Das A und O bei Zeigern ist jedoch: Ohne "saubere" Formulierung ist kein "sauberes" Verständnis möglich. Ich für meinen Teil bin weit davon entfernt, Zeiger zu beherrschen, sehe dieses Thema allerdings auch als eine Möglichkeit, zu lernen. Deine Herangehensweise kann ich hierbei nicht verstehen, da bislang reichlich Hinweise gegeben wurden so und jetzt zum letzten: 09: quelle str2 zeigt auf den speicher, aus dem gelesen werden darf terminierter string ist auch vorhanden str4 zeigt auf speicher, in den geschrieben werden darf speicher groß -> gültiger zugriff Du gehst hier nicht auf bisher Genanntes ein. Rufen wir uns einmal alle Zeilen in unser Gedächtnis zurück: 01 char *str1, *str4 = 0; 02 char str2 [] = "t2"; 03 char *str3 [2] = {" Element_0" , "Element_1" }; 04 str1 = malloc (5); 05 str3 [0] = str1; 06 strcpy ( str1, "test1"); 07 strcpy (str1, str2); 08 strcpy (str3[0], "test3"); 09 strcpy (str4, str2); Was geschieht in Zeile 9? Welche Operation wird verwendet? (was sollte dort geschehen?)Worauf verweist der Quellzeiger?Worauf verweist der Zielzeiger?Bitte nicht bisher Genanntes vergessen Die grundlegende Frage, welche Du Dir aber erst einmal beantworten solltest, ist: Was ist überhaupt ein Zeiger? Bevor das nicht klar ist (und ich habe nicht den Eindruck, dass dies so ist), kannst Du den Rest gleich vergessen. Bitte verstehe mich nicht falsch - es ist nicht böswillig gemeint. Der Zeiger ist in C ein ziemlich komplexes Thema, welches man erst einmal verstanden haben muss. @Klotzkopp Verzeihe und korrigiere bitte, sollte ich hier Mist schreiben Zitieren
e.full Geschrieben 21. November 2008 Autor Geschrieben 21. November 2008 ja ich verstehe das schon, ich danke auch klotzkopp also zeiger: zeiger, d.h. es ist eine variable, bieten doch jemanden, jetzt bezüglich in Programmiersprachen wie C, die möglichkeit, auf den speicher zuzugreifen. also bei 09: strcpy (str 4, str2); vorher hatten wir gesagt das str4 null ist und zu str2, dass es ein array auf dem stack ist, und die größe 3 hat da sollte doch eigentlich str2 in str4 kopiert werden ?? oder nicht Zitieren
AndiE Geschrieben 21. November 2008 Geschrieben 21. November 2008 ich bin mit der Aussage zu dieser Zeile nicht einverstanden: 03 char *str3 [2] = {" Element_0" , "Element_1" }; Es wird auschließlich der Platz für zwei Zeiger auf char deklariert. Aber nicht für die beiden Strings. deshalb ist auch diese Zeile ungültig. Richtig wäre 03 char* str3 [2][]={" Element_0" , "Element_1" }; Beispiel zur Erklärung: Erst werde zwei Objekte string1 und string 2 deklariert. Danach zwei Zeiger pstr1 und pstr2. Danach wird string1 gefüllt. Die Zeiger werden den Adressen der Anfänge der beiden Zeichenstrings zugewiesen. Anschließend wird string1 in string2 kopiert. char string1[20]; char string2[20]; char* pstr1; char* pstr2; string1= "Testeingabe"; pstr1=&string1[0]; pstr2=&string2[0]; strcpy(pstr2,pstr1); So sollte es funktionieren. LG Andre' Zitieren
e.full Geschrieben 21. November 2008 Autor Geschrieben 21. November 2008 also jetzt bevor ich ganz verwirrt bin, also ist jetzt auch zeile 3 ungültig oder wie?? ok.. und wie schaut es jetzt mit der zeile 09 aus Zitieren
unbenannt Geschrieben 21. November 2008 Geschrieben 21. November 2008 Zeiger bieten die Möglichkeit, auf den Speicher zuzugreifen bzw. Speicherinhalte zu bearbeiten. Ein Zeiger speichert lediglich eine Adresse im Speicher - er "zeigt" also auf den Anfang eines Speicherbereichs, in welchem wiederum ein Wert gespeichert ist, aber er speicher nicht den Wert selbst. Wenn nun also ein Zeiger lediglich eine Adresse speichert, was passiert dann, wenn ein Zeiger gleich NULL ist? (Im Beispiel also char *str4 = 0) Zitieren
e.full Geschrieben 21. November 2008 Autor Geschrieben 21. November 2008 heisst es dann nicht, das da dann nicht rein gespeichert werden darf, da es ja null ist Zitieren
Klotzkopp Geschrieben 22. November 2008 Geschrieben 22. November 2008 ich bin mit der Aussage zu dieser Zeile nicht einverstanden: 03 char *str3 [2] = {" Element_0" , "Element_1" }; Es wird auschließlich der Platz für zwei Zeiger auf char deklariert. Aber nicht für die beiden Strings. deshalb ist auch diese Zeile ungültig. Die beiden Strings sind Literale. Literale sind während der gesamten Laufzeit des Programms gültig, daher ist diese Zeile absolut korrekt. Man muss eben nur wissen, dass man auf Stringliterale nicht schreibend zugreifen darf. Richtig wäre 03 char* str3 [2][]={" Element_0" , "Element_1" };Das ist schon syntaktisch falsch. Du deklarierst hier ein zweidimensionales Array von char-Zeigern, der Initialisierer hat aber nur eine Dimension. Zitieren
Klotzkopp Geschrieben 22. November 2008 Geschrieben 22. November 2008 heisst es dann nicht, das da dann nicht rein gespeichert werden darf, da es ja null ist Schau dir noch mal an, was nicht erlaubt ist. Steht auf der ersten Seite dieses Threads . Zitieren
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.