[C] Speicherzugriffsfehler mit malloc

The Earl

The Earl

Grünschnabel
[Erledigt] [C] Speicherzugriffsfehler mit malloc

Bei dem folgendem Script, bekomme ich immer bei der Zahl "33789" einen Speicherzugriffsfehler.
Code:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, const *argv[]) {
	int *buffer = malloc(sizeof(int));
	int i = 0;
	for (i; i <= 350000; i++) {
		buffer[i] = i;
		printf("%i\n",buffer[i]);
	}
	puts("");
	return 0;
}

Aber auch wenn ich aus dem
Code:
int *buffer = malloc(sizeof(int));
ein
Code:
int *buffer = malloc(2*sizeof(int));
bleibt der Fehler an der selben stelle.
Wenn ich es aber in
Code:
int *buffer = malloc(350000);
ändere, erscheint der Fehler immer ab "88479".

Ob hier jemand wohl wüsste, wie ich größere Array's initialisieren kann ?
 
Zuletzt bearbeitet:
C ist bei mir schon sehr lange her, aber...

malloc reserviert dir doch die angegebene Anzahl an Bytes im Speicher und gibt den Pointer auf die Startadresse zurück.
Bei einem
Code:
malloc(sizeof(int))
werden z.B. auf einer 32-bit-Maschine 4 Byte reserviert, was genauer einem int-Wert entspricht.

In deinem Code inkrementierst du den Pointer nun weiter über buffer, was du aber eigentlich nicht darfst, da du keine Array, sondern nur eine Zahl reservierst hast. Dem C-Compiler ist das aber vermutlich egal und er lässt dich fleißig weitermachen, bis das Betriebssystem einschreitet, weil du den reservierten Speicherbereich für dein Programm übertreten hast.

Zur Lösung: Wenn du Speicher für ein Array reservieren möchtest, dann sieht das glaube ich, ungefähr so aus:
Code:
int *buffer = malloc(350000 * sizeof(int));
, wobei die 350000 die Anzahl Elemente deines Arrays sind. In dem Fall werden also 350000 * 4 Byte für dich reserviert.

Alternativ gibts da auch noch eine spezielle Funktion für Arrays:
Code:
calloc
glaube ich.

Und nicht vergessen, den Speicher wieder mit free freizugeben. :)

cu
 
'malloc' legt Speicher in Byte an. Um ein 'int' zu speichern, benoetigst Du 4 Byte (auf einem 32-bit System). Der Befehl 'malloc(350000)' gibt Dir die Adresse zurueck, ab der Du 350000 Byte hineinschreiben darfst. Das sind 350000/4 = 87500 int's. Wenn Du darueber hinaus schreibst, bekommst Du allerdings nicht sofort einen Speicherzugriffsfehler. Das haengt damit zusammen, dass Du innerhalb des Speichers, den der Kernel Deinem Programm zuordnet, machen darfst was Du willst.
Wenn Du ein array mit 350000 int's anlegen moechtest, musst Du den Befehl 'malloc (350000*sizeof(int))' benutzen. Dieses 'sizeof' solltest Du _IMMER_ benutzen, und niemals annehmen, dass Du wuesstest, wieviel Speicher ein int belegt. Einzig ein 'char' ist stets ein Byte gross, alles andere ist nicht festgelegt.
 
int ist der Datentyp, und hier wird der Speicherbedarf des Datentyps int abgefragt. Das steht aber auch schon im zweiten Post...
 
Code:
int *buffer = malloc(350000 * sizeof(int));
Auch dieser Code ist nicht wirklich richtig, wenn auch schon näher dran, als am Anfang. Die C/C++ Referenz (auf der es zu allen solchen Problemche kleine Beispielprogramme gibt) schreibt über malloc, dass es wie schon gesagt, die als Argument angegebene Anzahl an Bytes reserviert und einen Pointer zu der Startaddresse zurückgibt. Da es aber einen Unterschied machen kann, ob ein Pointer vom Typ Integer oder Char oder sontewas ist, müsste der Code korrekter Weise so aussehen:
Code:
int *buffer = (*int) malloc(350000 * sizeof(int));
Tatsächlich aber wäre es für Arrays sinnvoller die Funktion calloc zu verwenden. Der Code würde dann so aussehen:
Code:
int *buffer = (*int) calloc(350000, sizeof(int));
Zu beachten ist, dass malloc den Inhalt der Speicherzellen unverändert lässt, wärend calloc alle Bits auf 0 setzt.

Grüße, Blender3D
 
Da es aber einen Unterschied machen kann, ob ein Pointer vom Typ Integer oder Char oder sontewas ist, müsste der Code korrekter Weise so aussehen:
Code:
int *buffer = (*int) malloc(350000 * sizeof(int));
Um was fuer eine Art Zeiger es sich handelt, sagt doch bereits die Deklaration von 'buffer' als 'int *'. Die Zeigerumwandlung ist dann unnoetig.

Tatsächlich aber wäre es für Arrays sinnvoller die Funktion calloc zu verwenden.
Weswegen? Bei char* benutze ich gerne 'calloc', weil '\0' auch gleich das Wort-Ende-Zeichen ist, oder wenn ich davon Gebrauch mache, dass das Speicher auf 0 gesetzt wird, doch in vielen Faellen ist es doch egal, ob an der Stelle 1293 des Arrays eine Null oder irgendeine andere Ziffer abgespeichert ist.
 

Ähnliche Themen

C Code Hilfe!!! gesucht bei Dezimalzahl in Binärzahl for loop

Unix Webserver mit HTML Seite erstellen

Prozesskommunikation mit PIPES - wie funktioniert das?

GCC liefert in Eclipse Kompilierfehler

Ausführbare C-Datei von Mac OS auf Embedded Linux ausführen

Zurück
Oben