문제

다음과 같은 코드를 스택의 오버플로우에 대한 오류가 나

int main(int argc, char* argv[])
{
    int sieve[2000000];
    return 0;
}

어떻게 이것을 이용할 수 있을까요?나는 터보를 사용하여 C++지를 유지하고 싶은 나의 코드에서는 C

편집:

감사에 대한 조언입니다.위의 코드만 예를 들어,내가 실제로 배열 선언에서 기능 및 서브습니다.또한,내가 필요할 수 있는 배열로 초기화된 제로,그래서 때 봤 malloc,나는 것을 발견 calloc 었한 목적입니다.

Malloc/calloc 또한을 통해 이점을 할당하는 스택에서 허용하는 나에게 선언하는 크기를 사용하여 변수입니다.

도움이 되었습니까?

해결책

배열이 너무 커서 스택에 맞지 않아 힙을 사용하는 것을 고려하십시오.

int *sieve = malloc(2000000 * sizeof(*sieve));

스택 크기를 정말로 변경하고 싶다면 이 문서를 살펴보십시오.

: -Longer가 필요하지 않을 때 동적으로 할당 된 메모리를 해제하는 것을 잊지 마십시오.

다른 팁

세 가지 방법이 있습니다.

  1. 힙에 배열을 할당 - 사용 malloc(), 다른 포스터가 제안한 것처럼. 잊지 마십시오 free() 그것은 (그러나 main() 그다지 중요하지 않습니다. OS는 프로그램 종료시 메모리를 정리할 것입니다).
  2. 단위 레벨에서 배열을 선언하십시오 - 데이터 세그먼트에 할당되어 모든 사람에게 볼 수 있습니다 (추가 static 선언은 단위에 대한 가시성을 제한합니다).
  3. 배열을 그대로 선언하십시오 static -이 경우 데이터 세그먼트에 할당되지만 main().

스택이 아닌 힙에 할당하는 것이 좋습니다. 같은 것

int main(int argc, char* argv[])
{
    int * sieve;
    sieve = malloc(20000);
    return 0;
}

는 7 메가바이트 스택의 공간입니다.Visual studio 에서 사용하는 것/스택:###,###을 반영하여 원하는 크기를 설정합니다.당신이 진정으로 원하는 거대한 스택(수 있는 좋은 이유로 사용하는 LISP 또는 무언가:),심지어는 힙한 작은 'sh 할당하기 전에 당신이 사용하도록 강요하지 VirtualAlloc)할 수 있습니다 또한을 설정하려는 귀하의 PE 를 구축/LARGEADDRESSAAWARE(Visual Studio 의 링커시)지만,이 구성의 PE 헤더를 허용하는 컴파일된 바이너리를 주는 전체 4GB32'bit 주소 공간(실행하는 경우에 WOW64).을 구축하는 경우 진정으로 대규모 바이너리,당신은 또한 일반적으로 구성할 필요/bigobj 추가적으로 링커 paramerter.

그리고 당신은 여전히 공간이 더 필요할 수 있는 근본적으로 위반하는 규칙을 사용하여 뭔가를 시뮬(다시 MSVC 의 링크)/병합하는 것을 허용할 것이 팩을 하나의 섹션으로,다른 사용할 수 있도록 하나 하나 바이트에 대한 단일 공유 코드/데이터는 섹션입니다.자연적으로 당신은 또한 필요성 섹션에서 사용 권한 def 파일이나#pgrama.

Malloc을 사용하십시오. 모든 반환 유형이 NULL이 아닌지 확인하십시오. NULL이라면 시스템에는 많은 값에 맞는 메모리가 충분하지 않습니다.

Alloca ()를 사용하여 물체가 실제로 얼마나 큰지에 따라 스택 프레임에 필요한 공간을 할당 할 수없는 이유가 있습니까?

그렇게하면 여전히 스택을 터뜨리면 할당 된 힙에 넣으십시오. Main ()에서 정적으로 선언하지 않고 데이터 세그먼트에 넣는 것이 좋습니다.

그 경우 진짜 그다지 크고 프로그램을 힙에 할당 할 수 없습니다. 프로그램은 실제로 해당 유형의 기계에서 비즈니스를 실행하지 않습니다.

당신은 무엇을 (정확히) 성취하려고합니까?

당신의 배열은 거대합니다.

기계 나 OS가 너무 많은 메모리를 가지고 있거나 할당하지 않을 수 있습니다.


절대적으로 거대한 배열이 필요한 경우 동적으로 할당 할 수 있습니다 (사용 malloc(...)), 그러나 당신은 기억이 누출 될 위험이 있습니다. 메모리를 해제하는 것을 잊지 마십시오.

Malloc의 장점은 스택 대신 힙에 메모리를 할당하려고한다는 것입니다 (따라서 스택 오버플로가 얻지 못함).

Malloc이 반환하는 값을 확인하여 할당이 성공했는지 또는 실패했는지 확인할 수 있습니다. 실패하면 더 작은 배열을 malloc으로 시도하십시오.


또 다른 옵션은 링크 된 목록과 같은 즉시 크기를 조정할 수있는 다른 데이터 구조를 사용하는 것입니다. 이 옵션은 데이터와 관련하여 무엇을할지에 따라 다릅니다.

또 다른 옵션은 파일에 물건을 저장하여 데이터를 즉시 스트리밍하는 것입니다. 이 접근법은 가장 느립니다.

하드 드라이브에서 스토리지를 원한다면 기존 라이브러리 (데이터베이스 용)를 사용할 수도 있습니다.

Turbo C/C ++가 16 비트 컴파일러 INT DataType은 약 2 바이트를 소비합니다. 2BYTES*200000 = 40,00,000 바이트 = 3.8147MB 공간.

함수의 자동 변수는 스택에 저장되며 스택 메모리의 오버플로가 발생했습니다. 대신 프로세서 메모리 매핑의 가용성에 따라 필요한 메모리를 생성하기 위해 [정적 또는 글로벌 변수 사용] 또는 동적 힙 메모리 [Malloc/Calloc 사용]을 사용하십시오.

사용 malloc 대신에. 통사론:

newnode=(struct node *)malloc(sizeof(struct node))
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top