Folgende ist ein sehr einfaches C-Programm:Speicher von Daten (string) außerhalb der Grenzen in einem dynamisch zugeordneten Array
char *p = (char*)calloc(5,sizeof(char));
strcpy(p,"Elephant");
printf("String = %s\n", p);
p[6] = 'D';
printf("String = %s\n", p);
die eine char Array von 5 Elementen calloc zuordnet() und verwendet strcpy() zu kopieren, eine Zeichenfolge in das Array. Es folgt die Ausgabe:
String = Elephant
String = ElephaDt
klar, bat ich für 5 char Elemente nur und daher neugierig zu wissen, warum die OS-Speicher mgmt mir mehr Elemente aus den Grenzen des dynamisch zugewiesenen Raum in p zu speichern erlaubt . Wenn ich nur einen Raum von 5 Zeichen zugewiesen bekommen habe, wie konnte strcpy() eine noch größere Zeichenfolge "Elephant" speichern, die länger als 5 Zeichen ist?
C haben keine Grenzen-Überprüfung, der Compiler wird nicht beschweren (oder wirklich wissen), wenn Sie außerhalb der Grenzen schreiben. Das führt jedoch zu * undefiniertem Verhalten *, also tu es nicht. –
@Joachim Pileborg "wird sich nicht beschweren ... wenn Sie außerhalb der Grenzen schreiben" ist definiertes Verhalten. Natürlich spezifiziert C keine Grenzen-Überprüfung, aber ein Compiler kann es verwenden. Außerhalb der Grenzen schreiben ist UB. – chux
"warum die OS-Speicherverwaltung mir erlaubt, mehr Elemente außerhalb der Grenzen des dynamisch zugewiesenen Speicherplatzes in p zu speichern." -> Was haben Sie erwartet, dass der Code in einer solchen Situation benötigt wird? – chux