2016-09-20 5 views
2

Ich habe einen Segmentierungsfehler in meinem C-Code gefunden und konnte nach der Suche keine gute Erklärung oder Lösung dafür finden.Dynamisches Array von int-Zeigern verursacht Segmentierungsfehler

Dieser erste Code gibt mir Segmentierungsfehler nach 0.

#include <stdlib.h> 
#include <stdio.h> 
int main() { 
    int **defs = malloc(16 * sizeof *defs); 
    int i; 
    for (i = 0; i < 16; i++) { 
     printf("%d\n", i); 
     *defs[i] = i; 
    } 
    free(defs); 
    return 0; 
} 

Druck Dieser zweite Code funktioniert gut.

#include <stdlib.h> 
#include <stdio.h> 
int main() { 
    int *defs = malloc(16 * sizeof defs); 
    int i; 
    for (i = 0; i < 16; i++) { 
     printf("%d\n", i); 
     defs[i] = i; 
    } 
    free(defs); 
    return 0; 
} 

Dies sind nur Beispiele, nicht mein tatsächlicher Code. Ich habe auch versucht, Zeigerarithmetik, aber das gleiche Ergebnis. Könnte jemand bitte das erklären? Vielen Dank.

+2

'* defs [i]'. Bevor Sie das tun, müssen Sie 'defs [i]' initialisieren, um irgendwo zu zeigen. –

+1

Pointer müssen irgendwo zeigen, bevor dereferenziert wird –

Antwort

4

Im ersten Code haben Sie nicht alle int* Speicherblöcke zugewiesen. Bevor Sie also defs[i] Werte zuweisen, müssen Sie den Speicher mit dem Typ int* füllen.

defs[i] = (int*)malloc(sizeof(int) * number_of_elements); 

Und dann defs[i][some_index] = value.

+0

In meinem Fall, fügte 'def [i] = malloc (sizeof (int));' in der Schleife gearbeitet. Vielen Dank. – Munir

+0

Ihr 'def [i]' kann nur 1 Element speichern .... Sie können jedoch mehr als 1 Element speichern. Aber was Sie immer vermeiden sollten .... Segmentierungsfehler können auftreten. –

+0

@Munir ... um. Warum ordnen Sie einzelne 'int's auf dem Heap genau zu? Warum erstellen Sie sogar ein Array von Zeigern anstelle eines Arrays von 'int's, und warum verwenden Sie' malloc' anstelle von 'new'? –

Verwandte Themen