malloc?!
-
Hallo,
ich verstehe etwas ganz und gar nicht. Es geht um folgenden Sourcecode:
int **d = malloc(0); d[0] = malloc(4 * sizeof(int)); d[0][0] = 1; d[0][1] = 2; d[0][2] = 3; d[0][3] = 4; d[0][4] = 5; d[1] = malloc(4 * sizeof(int)); d[1][0] = 1; d[1][1] = 2; d[1][2] = 3; d[1][3] = 4; d[1][4] = 5; printf("%i\n\n", d[0][4]);
Er lässt sich mit gcc und VS2010Express(C Modus) einwandfrei kompilieren und das 2D Array wird mit korrekten Daten gefüllt. Ich verstehe aber nicht warum. Generell hab ich das Gefühl, dass malloc das macht was es will.
Ich dachte es ist so, dass malloc(size) size-Bytes reserviert und eine Zeigeradresse zurückgibt. Ich bastel mir als ein 2D Array in dem ich einen Zeiger erstelle der Platz für X Zeiger hat und dann für jeden dieser Zeiger Speicher reserviere.
Beispiel:
int **d = malloc(2 * sizeof(int*)); d[0] = malloc(2 * sizeof(int)); // Hier ist Platz für d[0][0] und d[0][1] d[1] = malloc(2 * sizeof(int)); // Hier ist Platz für d[1][0] und d[1][1]
So müsste ich ein 2x2-Array erhalten. Funktioniert auch soweit, aber komischerweise kann ich für das erste malloc eingeben was ich will. Und ich kann obwohl ich nur Platz für 2 Integerwerte reserviert habe, trotzdem noch weitere einfügen. Und ich verstehe einfach nicht warum. Hab ich einen Denkfehler oder gibt es etwas was ich missachte. Bitte helft mir zu verstehen was da wirklich passiert.
Grüße,
Simex
-
simex schrieb:
aber komischerweise kann ich für das erste malloc eingeben was ich will. Und ich kann obwohl ich nur Platz für 2 Integerwerte reserviert habe, trotzdem noch weitere einfügen. Und ich verstehe einfach nicht warum. Hab ich einen Denkfehler oder gibt es etwas was ich missachte. Bitte helft mir zu verstehen was da wirklich passiert.
Du kannst es, es ist aber nicht richtig. Damit überschreibst du Speicher, der nicht für dein Programm reserviert ist. Im besten Fall stürzt dein Programm ab, im schlechten Fall schleichen sich Fehler ein. Du kannst ein Array mit 5 Elementen erstellen, und auf das 6 Element zugreifen. C prüft keine Grenzen.
-
abhängig von dem verwendeten malloc algo kann es sein, (das jetzt blöd zu erklären) dass du nicht das bekommst was du bestellt hast sondern aufgerundete werte. so kann es z.b. sein das die kleinste einheit die dir malloc besorgen kann größer ist als x bytes das könnte man machen um die fragmentierung zu verringern.
lg lolo
-
Boar, das ging echt fix. Danke erstmal für die schnellen Antworten. Ich glaube langsam versteh ich das Ganze. Es ist schade, dass sowas in den Dokumentationen kaum erwähnt wird, denn ich finde es wichtig sowas als Programmierer zu wissen.
-
wichtig zu wissen ist, dass man versuchen sollte statische arrays zu verwenden;) alternativ kann man auch mehrdimensionale arrays mit einem einzigen malloc aufruf erzeugen.
z.b. gabs vor ein paar tagen hier einen thread
lg lolo