2014-01-06 2 views
1

배열을 인쇄하는 다음 코드를 작성했습니다. 그러나 입력이 매우 큰 경우 (예 : J = 40000) 세그먼트 분할 오류가 발생합니다. 왜 그런지 말해 줄 수 있니? 배열의 크기가 너무 크기 때문에 또는 내가 잘못했기 때문입니까?입력이 매우 큰 경우 세그먼트 오류가 발생합니다.

int main(){ 

    int i,j,J; 
    printf("Give the number J: \n"); 
    scanf("%d", &J); 

    double k[J-1]; 
    double d[J-1]; 
    double p[J-1]; 
    double A[J-1][3];  
    double h=1.0/(double)J; 

    for(j=0; j<J-1; j++){ 
     k[j]=-1.0/(h*h); 
     d[j]=2.0/(h*h); 
     p[j]=-1.0/(h*h); 
    } 


    for(j=0; j<J-1; j++){ 
     A[j][0]=k[j]; 
     A[j][1]=d[j]; 
     A[j][2]=p[j]; 
    } 


    A[0][0]=0.0; 
    A[J-2][2]=0.0; 

    for(j=0; j<J-1; j++){ 
     for(i=0; i<3; i++){ 
     printf("%lf ",A[j][i]); 
    } 
    printf("\n\n"); 
} 
return 0; 
} 

답변

0

C (C++이 아닌)로 프로그래밍하는 경우 프로그램 중간에 변수를 선언하면 문제가 발생할 수 있습니다. malloc()을 대신 사용하여 동적 배열을 만드십시오.

내가 볼 수있는 또 다른 문제는 다음 문장에 있습니다

A[J-2][2]=0.0; 

지수가 스택보다 낮은 0

+0

Ok! 그리고 어떻게 malloc()을 2 차원 배열에 사용할 수 있습니까? –

+0

malloc()은 메모리를 바이트 수로 예약합니다. 그것이 1, 2 또는 3 차원이라면 중요하지 않습니다. 예를 들어, 선언하려는 경우 : double A [J-1] [3]; (J-1) * 3 바이트가됩니다. 그래서 사용해야합니다 : double * A; A = malloc ((J-1) * 3); 그리고 원하는대로 사용할 수 있습니다 (이 경우 2 차원 배열로) – Abend

+0

좋습니다! 당신의 도움을 주셔서 대단히 감사합니다! –

1

아마 문제가 될 것이기 때문에 J = 1, 예를 들어 그것은 당신에게 문제를 가져올 경우 과다.

40000 x (1 + 1 + 1 + 3) x 8 = 1920000 bytes 

일예 : 귀하의 스택 기반 배열 k, p, dA 약이 필요합니다 약 2 메가 바이트. 기본 최대 스택 크기는 일반적으로 1 메가 바이트입니다.

http://msdn.microsoft.com/en-us/library/tdkhxaks.aspx 또는 Change stack size for a C++ application in Linux during compilation with GNU compiler 또는 Getting a stack overflow exception when declaring a large array입니다.

+1

나는 이해한다 ... 고맙습니다 !!! –

관련 문제