2016-06-25 6 views
-5

Ich versuche, ein Problem im Hacker-Rang zu lösen. Wenn ich den folgenden Code auf meinem lokalen System ausführe, wird kein Fehler angezeigt. Aber wenn ich es einreiche, zeigt es eine segmentation fault.Segmentation Fehler tritt in C-Programm

Er akzeptiert den ersten Testfall, aber die übrigen Testfälle führen zu einem segmentation fault.

#include<stdio.h> 
#include<stdlib.h> 

int main(void) 
{ 
    int n,q,i,j; 
    scanf("%d %d",&n,&q); 

    int k,l,m,seq,lastAns=0; 
    int **arr; 
    arr=(int **) malloc(sizeof(int)*n); 

    if(!arr) return 0; 

    arr[0] = (int *) malloc(sizeof(int)*q*n); 

    for(i = 0; i < n; i++) 
     arr[i] = *arr + i*q ; 

    if(!*arr) return 0; 

    for(i = 0; i < q ; i++) 
    { 
     scanf("%d%d%d",&k,&l,&m); 
     switch (k) 
     { 
      case 1: seq= (l^lastAns)%n; 
       for(j = 0 ; j < q; j++) 
       { 
        if(!arr[seq][j]) 
        { 
         arr[seq][j]=m; 
         break; 
        } 
       } 
       break; 
      case 2: 
       seq= (l^lastAns)%n; 
       lastAns = arr[seq][m % n]; 
       printf("%d\n", lastAns); 
       break; 
     } 
    } 
    free(arr[0]); 
    free(arr);  
    return 0; 
} 
+0

'arr = (int **) malloc (sizeof (int) * n);' - >> 'arr = (int **) malloc (sizeof (int *) * n);' - >> 'arr = (int **) malloc (n * sizeof * arr);' - >> 'arr = malloc (n * sizeof * arr);' – wildplasser

+0

Fragen Sie sich, was Sie mit '(int **) malloc erreichen möchten (sizeof (int) * n); '? – sjsam

+0

Ich möchte Speicher für n Doppelzeiger –

Antwort

0

Wie sjsam wies darauf hin, diese Aussage ist falsch:

arr=(int **) malloc(sizeof(int)*n); 

Ihr Programm auf Systemen funktioniert, wo sizeof(int) == sizeof(int*) (dh 32-Bit-Systeme), wird aber wahrscheinlich nicht auf 64-Bit-one (auf welche sizeof(int) == 4 und sizeof(int*) == 8.

ich möchte ein 2D-Array dynamisch der Dimension n erzeugen, indem q

Wir verstehen, dass, und Sie haben erstellt ein solches Array hier:

arr[0] = (int *) malloc(sizeof(int)*q*n); 

Aber Sie schaffen etwas anderes auf die Problemstellung; nämlich ein Array von nZeigern, kein Array von n ganzen Zahlen.

+0

reservieren danke für die Hilfe. Ich möchte ein 2D-Array dynamisch von Dimension n von q erstellen. –

+0

@ManoharManu Ich habe die Antwort aktualisiert. –