Zum Inhalt springen

Empfohlene Beiträge

Geschrieben

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

  • Antworten 54
  • Erstellt
  • Letzte Antwort

Top-Benutzer in diesem Thema

Geschrieben
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

Hast 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 zugriff

Warum?

bei 09:

der quellzeiger zeigt auf den speicher

in das ziel darf geschrieben werden

enthält einen terminierten string.

deshalbt gültig

Wohin zeigt denn der Zielzeiger?
Geschrieben

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

???

Geschrieben
bei 07:

die quelle ist str.2 und hate eine länge von 8

in das zielspeicher dürfen 10bytes geschrieben werden

Wie kommst du auf 8 und 10?

08:quelle ist str2 und hat eine länge von 8

in das zeilspecher dürfen 10bytes geschrieben werden

str2 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?

Geschrieben

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

Geschrieben
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.

Geschrieben

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

Geschrieben
es tut mir sehr leid bin bisschen verwirrt
Ist 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 3

Zum 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.

Geschrieben

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

Geschrieben

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

Geschrieben
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?

  1. Welche Operation wird verwendet? (was sollte dort geschehen?)
  2. Worauf verweist der Quellzeiger?
  3. Worauf verweist der Zielzeiger?
  4. 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 ;)

Geschrieben

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

Geschrieben

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'

Geschrieben

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)

Geschrieben
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.

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...