Warum reicht malloc(1)?
-
Nabend!
Ich weiß nicht, ob es an meinem Kompilierer GCC liegt, aber ich frage mich, warum ich beliebig viele Zeichen in ein char* kopieren kann, wobei ich nur Speicher mit malloc(1) reserviert hab.
#include <stdio.h> #include <stdlib.h> int main() { char *string; string = malloc(1); strcpy(string, "AaaaaBbbbbCccccDddddEeeeeFffffGggggHhhhhIiiii"); printf("%s\n", string); }
Ausgabe:
AaaaaBbbbbCccccDddddEeeeeFffffGggggHhhhhIiiii
Weiß jemand warum?
MfG
Danke
-
Zufall. Kann funktionieren, tut es nicht immer und überall und ist einfach falsch.
-
Du überschreibst für Dein Miniprogrämmchen gerade nichts Wichtiges und kratzt an keiner Segmentgrenze - das heißt aber nicht, daß es nicht auch später krachen kann, was die Fehlersuche besonders lustig macht, weil ursprünglicher Fehler und crash weit auseinanderliegen können.
Ist ein schwerer Bug, gerade wenn er nicht sofort auftritt. Also: Augen auf beim Speicherkauf
(per malloc()).
-
Hab das Beispiel noch mal um einen zweiten String erweitert und siehe da, der Bereich vom ersten wird überschrieben.
Änderung: Ich habe noch mal eine Frage. Wie kann ich den Speicher für "AaaaaBbbbbCccccDddddEeeeeFffffGggggHhhhhIiiii" reservieren, sodass er in "string" passt? Mit sizeof("AaaaaBbbbbCccccDddddEeeeeFffffGggggHhhhhIiiii") klappts nicht.
-
strlen(AaaaaBbbbbCccccDddddEeeeeFffffGggggHhhhhIiiii")+1
Das +1 für das Stringendezeichen.
-
malloc(1) kann nicht ein einziges Byte reservieren sondern reserviert einen Block (z.b. 512 Bytes) der groß genug ist, ein Byte zu speichern. malloc liefert einen Zeiger zum Anfang des Blockes. Das liegt daran, dass die MMUs in der Regel nur Blöcken verarbeiten können und nicht einzelne Adressen. Der Kernel muss also mit Blöcken arbeiten. Es kann also sein, dass malloc(10) einen gliech großen Block wie malloc(1) bekommt. Es ist sichergestellt, dass bei malloc(x) mind. x Bytes geschrieben und gelesen werden können.