2012-03-30 5 views
3

u_int64_t 배열 : 내 우분투 10.10 64 비트 (GCC 4.6.1)에서나는이 작업을 수행하기 위해 노력하고있어

int main(void){ 
    u_int64_t NNUM = 2<<19; 
    u_int64_t list[NNUM], i; 

    for(i = 0; i < 4; i++){ 
     list[i] = 999; 
    } 
} 

하는 이유는 무엇입니까는 segfault?

+8

스택 오버 플로우 오버 플로우 ... :) – Mysticial

+0

@ 미스테리 무엇? –

+0

올바른 이름은'uint64_t'가 아니라'uint64_t'입니다. 후자는 표준 C에 존재하지 않으며 레거시 소프트웨어와의 호환성을 위해서만 POSIX'sys/types.h '에 보존되는 레거시 이름입니다. –

답변

5

스택에 매우 큰 배열을 만들려고합니다. 스택 오버플로가 발생합니다.

대신 힙에 배열을 할당 해보십시오. 예 :

// Allocate memory 
u_int64_t *list = malloc(NNUM * sizeof(u_int64_t)); 

// work with `list` 
// ... 

// Free memory again 
free(list); 
+0

힙을 가지고 무엇을 의미합니까? 무심코 죄송합니다. –

+0

전역 (main() 외부에서 선언) 또는 static (main에 로컬로 유지)으로 설정하여이 작업을 수행 할 수 있습니다. – tomlogic

+0

또는 malloc을 사용하여 배열을 할당하십시오. –

2

NNUM = 2*2^19 == 2<<19 == 1048576을 선언하십시오.

스택에 64 비트 * 1048576 = 셀의 비트 수 * num을 할당하려고합니다. 8.5 MegaBytes입니다. 스택에 할당하기에는 너무 많습니다. 힙에 할당하고 실제로 반환 값 malloc을 사용하는지 확인하십시오. 당신이 'ulimit를 -s', 그것은 가장 가능성이보다 작은 확인하는 경우

heap VS. stack

0

여러분의 프로그램은 1048576, 의 최소 스택 크기를 필요로한다. 'ulimit -s 16384'를 시도한 다음 다시 실행하십시오.

관련 문제