[C] Speicherzugriffsfehler mit malloc

Dieses Thema im Forum "C/C++" wurde erstellt von The Earl, 15.04.2011.

  1. #1 The Earl, 15.04.2011
    Zuletzt bearbeitet: 17.04.2011
    The Earl

    The Earl Grünschnabel

    Dabei seit:
    03.11.2010
    Beiträge:
    9
    Zustimmungen:
    0
    [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 ?
     
  2. Anzeige

    Schau dir mal diese Kategorie an. Dort findest du bestimmt etwas.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  3. #2 Plinzen, 15.04.2011
    Plinzen

    Plinzen Foren As

    Dabei seit:
    11.04.2007
    Beiträge:
    96
    Zustimmungen:
    0
    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
     
  4. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    '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.
     
  5. #4 Gast123, 15.04.2011
    Gast123

    Gast123 Guest

    Was ist denn "int" hier in der Klammer...?
    Vielleicht eine nicht initialisierte Variable?

    LG
     
  6. daboss

    daboss Keine Macht für niemand!

    Dabei seit:
    05.01.2007
    Beiträge:
    1.294
    Zustimmungen:
    0
    Ort:
    sydney.australia.world
    int ist der Datentyp, und hier wird der Speicherbedarf des Datentyps int abgefragt. Das steht aber auch schon im zweiten Post...
     
  7. Anzeige

    Vielleicht findest du HIER Antworten.
    Registrieren bzw. einloggen, um diese und auch andere Anzeigen zu deaktivieren
  8. #6 Blender3D, 05.10.2011
    Blender3D

    Blender3D Vitamin C++

    Dabei seit:
    17.09.2007
    Beiträge:
    228
    Zustimmungen:
    0
    Ort:
    /root
    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
     
  9. rikola

    rikola Foren Gott

    Dabei seit:
    23.08.2005
    Beiträge:
    2.133
    Zustimmungen:
    0
    Um was fuer eine Art Zeiger es sich handelt, sagt doch bereits die Deklaration von 'buffer' als 'int *'. Die Zeigerumwandlung ist dann unnoetig.

    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.
     
Thema: [C] Speicherzugriffsfehler mit malloc
Besucher kamen mit folgenden Suchen
  1. C malloc Fehler

Die Seite wird geladen...

[C] Speicherzugriffsfehler mit malloc - Ähnliche Themen

  1. ClamAV meldet Speicherzugriffsfehler

    ClamAV meldet Speicherzugriffsfehler: Hi, mein ClamAV will nicht starten: # /etc/init.d/dansguardian start Starting DansGuardian: dansguardianLibClamAV Warning:...
  2. Dansguardian bringt Speicherzugriffsfehler

    Dansguardian bringt Speicherzugriffsfehler: Wenn ich Dansguardian starten will, mekkert er: Starting DansGuardian: dansguardianLibClamAV Warning:...
  3. Speicherzugriffsfehler

    Speicherzugriffsfehler: beim Aufruf von sprintf(name,"Alex");bekomme ich einen Speicherzugriffsfehler. name wurde initialisiert am anfang der funktion mittels char...
  4. apt-get Speicherzugriffsfehler

    apt-get Speicherzugriffsfehler: Hallo, habe ein Debian System neu augesetzt und habe anschließend mit apt-get install ssh den SSH-Server installiert. Nun wollte ich weitere...
  5. Speicherzugriffsfehler; vertauscht hde/hda; debian

    Speicherzugriffsfehler; vertauscht hde/hda; debian: Hallo Ich habe ein Seltsames Problem mit meinem Desktop PC: Da ich mir ein Notebook zugelegt Habe benutze ich meinen Desktop PC nicht mehr...