2017-09-29 1 views
1

Warum bekomme ich einen segfault Fehler für *a[1]=1;, obwohl ich bereits Platz auf dem Haufen mit malloc dafür reserviert habe?seg Fehler im dynamischen Array (C)

void d(int **a, int count){ 
    *a = malloc(sizeof(int)*count); 
    *a[1]=1; 
} 

int main(){ 
    int count =10; 
    int *a; 
    d(&a, count); 
} 
+1

Beide Antworten zeigen Ihnen in die richtige Richtung. * Vorrang für den Operator *. Es ist nur eines dieser Dinge, die Sie lernen müssen (das wird leider in den meisten Tutorials weggelassen) –

Antwort

2

Ihre Zuweisungsoperation *a[1]=1 entspricht *(a[1])=1 nach operator precedence rules. Wenn Sie a zu dereferenzieren beabsichtigen zuerst, und dann Zugriff auf das Element mit dem Index 1, sollten Sie die Klammern enthalten, um Ihre Absicht klar zu machen: (*a)[1]=1

4

*a[1] = 1; wahrscheinlich nicht tun, was Sie denken, es tut. Da die Klammern für die Indizierung eine höhere Priorität haben als die Dereferenzierung, können Sie sich so vorstellen, als ob sie a als Zeiger auf Integer behandeln und versuchen, auf das zweite Element davon zuzugreifen, bevor Sie Dereferenzierung vornehmen, um die ganze Zahl zu erhalten. eher als ein Zeiger auf ein Array von ganzen Zahlen. Da dies nicht der Fall ist, segmentiert es, da es wahrscheinlich eine schlechte Adresse gibt, die dann in dieser Position dereferenziert wird.

Wenn Sie es jedoch in (*a)[1] = 1; ändern, wird der Zeiger zuerst dereferenziert und der Speicher, dem Sie ihn zugewiesen haben, ordnungsgemäß indiziert.

+0

Sie haben Recht - danke! – onezeroonefive