Markus Wi*** schrieb:
Also für die Ziffer 255 -> Arraygröße 4, also char wert[3] (da von
> 0-3=4)
Nein.
Um 3 Nutzzeichen zu speichern, brauchst du ein Array der Länge 4, weil
ja das '\0' Zeichen noch hinten drann kommt.
Also wert[4];
> Habe es jetzt mal so probiert: [c]
> char wert[1];
Wenn du das Array 1 Zeichen lang machst, dann passt gerade mal die '\0'
Terminierung da rein. Nicht sehr sinnvoll.
> Die Arraygröße von wert ist ja jetzt eigendlich zu klein aber trotzdem
> geht es...
Das sieht nur so aus.
Du bügelst Speicher nieder, der nicht zum Atrray gehört. Je nachdem wie,
wann und wo dieser Speicher benutzt wird, kommt es irgendwann zu den
tollsten Effekten.
> Aber wieso ??
Weil C keine Sprache für Leute ist, die eine Tante zum Lulu gehen
brauchen. Du bist für alles verantwortlich! Wenn du etwas verbockst,
gibt es kein Sicherheitsnetz. Wenn du Speicher niederbügelst, der dir
nicht gehört, dann hindert dich keiner daran. Aber du musst damit
rechnen, dass seltsame Dinge passieren. Wenn du Glück hast, dann liegen
in diesem Speicher einfach nur andere Variablen, die dann magisch ihren
Wert ändern. Wenn du sehr viel Glück hast, dann schmiert dir das Pgm
einfach ab, weil du den Returnstack niedergebügelt hast. Wenn du
allerdings Pech hast, dann gibt es zunächst überhaupt keine sichtbaren
Auswirkungen und der Fehler wartet auf den Zeitpunkt an dem er maximalen
Schaden anrichten kann.
> Aber die Funktion sende_string überprüft den Terminator und
> wie soll er den finden wenn das Array "offziel" nur bis wert[1] geht ??
sende_string liest den Speicher byteweise aus. Punkt.
Es hört dann auf, wenn es im Speicher auf ein 0-Byte stösst. Punkt.
Alles andere interessiert sende_string nicht. Insebsondere interessiert
sende_string nich, ob und wenn ja wieviele Bytes zum Array gehören,
dasss der Aufrufer bereitzustellen hat. Für sende_string gibt es nur
Speicher und einen bestimmten Wert im Speicher, an dem es aufhört.
Remember - kein Sicherheitsnetz. Wenn im Speicher die nächsten 4
Gigabyte kein 0-Byte kommt, dann schickt sende_string die 4 Gigabyte,
bis es auf ein Byte mit dem Wert 0 stösst. Wenn keines kommt, dann hört
sende_string nie auf.