2014-09-26 7 views
-3

이렇게 코딩되었지만 seg-fault가 발생합니다.C++에서 포인터 배열 사용

무엇이 잘못 되었나요?

int vector_size = 100000000; 

float *rows[vector_size]; 

for (int i=0; i<vector_size; i++) { 
    rows[i] = (float *)malloc(sizeof(float)*2); // crashed here 
    // ... 
} 
+4

아마도 시스템에 메모리 오버플로가 있습니까? –

+3

거의 400MB (32 비트 시스템에서는 64 비트 시스템에서 두 배)의 배열을 만들려고합니다. 배열을 로컬 변수로 선언하면 모든 시스템의 스택 크기를 넘을 수 있습니다 (대부분의 (?) 컴파일러는 스택에 로컬 변수를 저장하고 스택은 일반적으로 단일 숫자 MB 범위에 있음) . –

+1

어떤 i 값에서 충돌이 발생 했습니까? 시스템의 스택 크기 제한에 주목 했습니까? – Jepessen

답변

1

방대한 양의 메모리를 할당하려고합니다. 이 많은 수레가 정말로 필요하다면, 각각에 대해 별도의 malloc을 사용하는 것은 나쁜 계획 일 것입니다. Malloc에는 할당 할 수있는 최소 블록 크기가 있으므로 자체 오버 헤드가 있으며 메모리 관리자는 보유하고있는 포인터 목록의 크기는 말할 것도없고 별도로 할당 된 모든 메모리 영역을 추적해야합니다.

더 나은 솔루션 ... ... 시도하고 포인터의 목록을 유지보다는, 그래서

모든 수레에 대한 단일 블록 충분한 공간을 할당 할 수 있으며, 배열로 인덱스 수도

float *rows = malloc(sizeof(float) * vector_size); 

이 더 좋은 출발점 일 수 있습니다.

+0

에 대한 1MB 기본 제한으로 고맙습니다. 너무 바보 같았습니다. :) – JaycePark

0

스택에 있지만 힙에 메모리를 할당 해보십시오.

float **rows = new float*[vector_size]; 

그리고 무슨 메시지가 나옵니까?

추신 : \ : 메모리) (malloc을 종료하는 경우는 NULL을 반환하기 때문에

그것은, 메모리 오버 플로우처럼 보이지 않는다 미안 내 영어)

upd. 오, 위의 설명을 보지 않았습니다.