ich kann den code nicht verstehen

Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.

ich kann den code nicht verstehen

#include <stdio.h>

int main() {
	char *s;

	s = (char *) malloc(1);
	fgets(s, 21, stdin);
	printf("%s\n", s);
	free(s);
}

code funktioniert, aber s zeigt doch nur auf 1 byte speicher, wieso kann fgets mehr als 1 zeichen in dem 1 byte puffer unter s speichern? :wand:


Dann mach mal
valgrind --tool=memcheck --leak-check=yes ./deinprogramm
und schau was der dir sagt. :wink:


Danke für den Hinweis :slight_smile:
habe ein cooles tool kennengelernt :gun:
und wenn ich es auch richtig verstanden habe, heisst es, dass das programm trotz ein paar “invalid write” (fgets) bzw “invalid read” (printf) funktioniert hat???


das liegt dadran dass du den speicherbereich dahinter überschreibst, was wenn dort noch nix steht kein problem ist, aber wenndu dort e.g. eine struktur hast mit nem pointer als member dann kanns vorkommen dass du nen segfault bekommst wenn du den pointer verwendest

war in der debug aufgabe übrigens auch mit drin ^^


Das Programm ist natürlich falsch und sowas endet normalerweise in einem ungewollten Verhalten. Warum das nicht sofort einen Fehler verursacht, wenn man in den Speicher schreibt, den man nicht explizit reserviert hat liegt daran, dass intern (z:B. in der malloc Implementierung, da habt ihr ja gesehen, dass das gar nicht so schwer ist) mehr reserviert wird, als gerade von dir angefordert, allerdings wird der beim naechsten malloc doch verwendet.

Ein Segfault - den du wahrscheinlich erwartet hast - kommt erst dann, wenn dein Prgramm versucht auf Speicher zuzugreifen, der auf einer page, der gar nicht dem Prozess gehoert. Die pages bzw. das Paging ist ein Verfahren vom Betriebssystem, wie der physikalische Speicher auf die Prozesse verteilt wird.


fgets () macht nur, was du ihm sagst - es liest hoechstens 21 Byte ein und speichert diese ab der angegebenen Adresse. Ob dir der Speicher dazu gehoert oder nicht - das ist deine Sache. Wenn du „Glueck“ hast, kriegst du einen Segmentation Fault, wenn du Pech hast, dann zeigt dein Programm erst irgendwann ein ganz komisches Verhalten, obwohl „vorher alles funktioniert hat“.