Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Zeiger

Empfohlene Antworten

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
  • Ansichten 7.5k
  • Erstellt
  • Letzte Antwort

ist das denn jetzt richtig wie ich das gemacht habe

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?

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

???

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?

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

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.

also ist str2 dann auch der länge 5

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

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.

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

ah dann ist das also wieder ein ungültiger zugriff

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

wie kommen sie denn da drauf,

ich verusche es so zu machen wie ich es verstehe.

sonst lerne ich doch nix daraus

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 ;)

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

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'

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

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)

heisst es dann nicht, das da dann nicht rein gespeichert werden darf, da es ja null ist

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.

Archiv

Dieses Thema wurde archiviert und kann nicht mehr beantwortet werden.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.