2016-06-25 4 views
-5

해커 순위 문제를 해결하려고합니다. 로컬 시스템에서 다음 코드를 실행하면 오류가 표시되지 않습니다. 하지만 제출하면 segmentation fault이 표시됩니다.C 프로그램에서 세그먼트 오류가 발생했습니다.

첫 번째 테스트 사례를 수락했지만 나머지 테스트 사례는 segmentation fault이됩니다.

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

프로그램이 어디 sizeof(int) == sizeof(int*) (즉, 32 비트 시스템) 시스템에서 작동하지만, 아마에 (64 비트 것들에 실패합니다 sjsam는 지적

#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 *) * n); - >> – wildplasser

+0

'(int **) malloc (malloc)을 사용하여 달성하고자하는 것을 자문 해보십시오. (sizeof (int) * n);'? – sjsam

+0

도움을 주셔서 감사합니다. 이중 포인터 N –

답변

0

,이 문은 잘못 난 Q 의해 동적 차원 (n)의 2 차원 배열을 생성 할 sizeof(int) == 4sizeof(int*) == 8.

우리는 이해, 당신은 여기에 같은 배열 생성이 :

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

을하지만 문제 문에 뭔가 다른 를 만드는; 즉 n포인터의 배열이고 n의 배열이 아닙니다.

+0

에 대한 메모리를 할당하고 싶습니다. 나는 차원 n을 q로 동적으로 2 차원 배열을 만들고 싶다. –

+0

@ManoharManu 답변을 업데이트했습니다. –

관련 문제