2017-09-10 1 views
-2

enter image description here C에서 배열을 동적으로 초기화 할 때마다 항상 SIGSEGV 오류가 발생합니다. 왜 내가 항상 잘못된 작업을하고 있는지 말해주십시오.SIGSEGV in C 오류

코드는 TurboC에서 잘 작동하지만 GCC를 사용하는 온라인 판사에게 SIGSEGV를 제공합니다.

Programming Problem

내 코드 : 시작을 위해

#include<stdio.h> 
#include<stdlib.h> 
int main(void) 
{ 
    long n,h,i,crane=0,box=0,temp=0; 
    long *comm; 
    scanf("%ld %ld",&n,&h); 
    long *a = (long*)malloc(n*sizeof(long)); 
    for(i=0;i<n;i++) 
     scanf("%ld",&a[i]); 
    scanf("%ld",&comm[0]); 
    i=0; 
    while(comm[i]!=0) 
    { 
     i++; 
     scanf("%ld",&comm[i]); 
    } 
    for(i=0;comm[i]!=0;i++) 
    { 
     if(comm[i]==3) 
      box=1; 
     if(comm[i]==4 && box==1) 
     { 
      a[crane]=(a[crane]+1); 
      temp=0; 
     } 
     if(box==1 && (comm[i]==1 || comm[i]==2) && temp==0) 
     { 
      a[crane]=(a[crane]-1); 
      temp=1; 
     } 
     if(crane!=0 && comm[i]==1) 
      crane--; 
     if(comm[i]==2) 
      crane++; 
     if(comm[i]==0) 
      break; 
    } 
    for(i=0;i<n;i++) 
     printf("%ld ",a[i]); 
    free(a); 
    free(comm); 
    return 0; 

}

+1

프로그램 실행은 위에서 아래로 진행됩니다. 그런 다음 초기화하기 전에 변수'n'을 사용하십시오. –

+0

@Someprogrammerdude 아, 미안. 알았어. Lemme가 다시 컴파일합니다. –

+0

네,'n'의 값이 * 불확정 * 일때 (mandom) * malloc에 ​​대한 호출에서 어떻게 생각하십니까? –

답변

1

, 그 코드에서 갑자기 당신은 실제로 가리 키도록 comm에 대한 메모리를 할당한다. a에 대해 비슷한 작업을했기 때문에이 작업이 필요하다는 것을 분명히 알고 있으며, acomm을 모두 비울 수 있습니다.

의 메모리를 사용하기 전에 malloc의 메모리가 필요합니다. 예를 들어, 당신은 (그것을 다른 곳에서는 사용하지 이후, h 가능성) 즉, 당신이 추가해야 두 번째 값 입력에 의존하고 싶었 : 지적, 첫 scanf

comm = malloc(h*sizeof(long)); 

그 I 돈 't는 반환 값을 캐스팅 - 당신은 C.

에 당신이 경우 그렇게하지 말아야하는 것은comm이 그것을 사용하기 전에해야 얼마나 큰 알고, 그것을 처리하는 일반적인 방법은 특정 번호를 할당하는 것입니다 요소 수 (용량)를 확인하고 사용 횟수 (크기)를 추적합니다. 크기가 용량을 초과 할 때마다 realloc을 사용하여 더 많은 공간을 확보하십시오.

다음 (C-같은) 의사 코드는 하늘의 배열로 시작 삼십 개 요소에 더 많은 공간이 필요할 때마다 시간을 확대하고,이 작업을 수행하는 방법을 보여줍니다

comm = NULL 
capacity = 0 
size = 0 
for each value in input(): 
    if size == capacity: 
     capacity += 30 
     comm = realloc (comm, capacity), exit if error 
    comm[size++] = value 

주, 그 루프 exit, size은 더 많은 용량이있을 수 있음에도 불구하고 배열에 몇 개의 요소가 있는지를 나타내는 지표입니다.


그리고, 같은 제쳐두고, 당신이해야 항상 어떤 시점에서 실패합니다 (예 : scanfmalloc으로) 실패에 따라 호출하는 가정합니다. 즉, 반환 값을 확인하십시오.

+0

입력이 0이 될 때까지 계속 크기를 늘려야하고 realloc을 여러 번 호출하도록 많은 포인터를 선언 할 수는 없습니다. –