2011-08-05 8 views
1

다음 코드로 세그먼트 화가 계속됩니다. 4000을 1000으로 변경하면 코드가 올바르게 실행됩니다. 여기에 충분한 기억이 있다고 생각합니다 ... 어떻게 해결할 수 있습니까?작은 (ish) 2d 배열의 세그먼트 화 오류

#include <stdio.h> 
#include <math.h> 
#include <stdlib.h> 
#include <string.h> 
#define MAXLEN 4000 

void initialize_mx(float mx[][MAXLEN]) 
{ 
    int i, j; 
    float c=0; 
    for(i=0;i<MAXLEN;i++){ 
    for(j=0;j<MAXLEN;j++) mx[i][j]=c; 
    } 
} 
int main(int ac, char *av[]) 
{ 
    int i, j; 
    float confmx[MAXLEN][MAXLEN]; 
    initialize_mx(confmx); 
    return 0; 
} 
+0

@berry : 배열 유형을 malloc으로 초기화 할 수는 없으며 포인터 유형 만 초기화 할 수 있습니다. –

+0

@Dietrich Epp 미안하지만, 당신은 당연히 당황 스럽다. 내 C가 녹슬 었는지 보여줍니다. (피곤할 때 임시 코멘트를 게시해서는 안됩니다.) – berry120

답변

3

문제는 스택 오버플로입니다.

initialize_mx()을 호출하면 로컬 변수 (사용자의 경우 confmx)에 스택 공간이 할당됩니다. 이 공간은 지역 변수가 너무 큰 경우 OS (Linux의 경우 ulimit 확인)로 제한되며, 오버플로 될 수 있습니다.

기본적으로 수행 할 수 있습니다 cnicutar에서 알 수 있듯이 글로벌 변수로

  1. 선언 confmx.
  2. Allocate memory space for your array dynamically.initialize_mx()

편집에 대한 포인터를 전달 : 그냥 당신이 포인터를 전달하면 당신이 그 두 가지 옵션 : 그래서 당신은 여전히 ​​메모리 공간을 할당해야 실현

+2

이 사이트는 StackOverflow라고 불리는 매우 합리적인 질문입니다.

+0

내 첫 번째 질문은 여기에 그래서 내가 내 문제를 이해하는 가이드로 연결 해요 튜토리얼을 사용;) – kirbuchi

1

스택에 4000 * 4000 * 4 바이트를 사용하고 있습니다. 계산 오류가없는 경우 61MB가 많습니다. 이 경우 스택에서 거의 4MB 만 사용하기 때문에 1000과 작동합니다.

1

4000*4000*sizeof(float)==64000000. 운영 체제에서 스택 크기가 4MB에서 64MB 사이로 제한 될 수 있습니다.

0

다른 사람들이 좀 작은 ISN을 언급했듯이 ' 스택에 할당 된 auto 클래스 변수의 경우 작은 값입니다.

는 필요에 따라

static float confmx[MAXLEN][MAXLEN]; 

BSS에의 스토리지를 할당 할 수있다. 스파 스 매트릭스가 필요한 경우가 많고 많은 셀이 0 인 매트릭스를 저장하고 액세스하는 더 효율적인 방법이 있으므로 다른 스토리지 시스템을 고려할 수 있습니다.

관련 문제