대규모 어레이를 선언할 때 스택 오버플로 예외가 발생하는 중
다음 코드가 스택 오버플로 오류를 생성하고 있습니다.
int main(int argc, char* argv[])
{
int sieve[2000000];
return 0;
}
이걸 어떻게 극복하지?Turbo C++를 사용하지만 코드를 C로 유지하고 싶습니다.
편집:
조언해 주셔서 고마워요.위의 코드는 예를 들어 서브메인이 아닌 함수에서 어레이를 선언하는 것에 불과합니다.또한 어레이를 0으로 초기화해야 했기 때문에 malloc을 검색해보니 calloc이 제 목적에 딱 맞는다는 것을 알게 되었습니다.
또한 Malloc/calloc은 변수를 사용하여 크기를 선언할 수 있는 스택에 할당하는 것보다 장점이 있습니다.
어레이가 너무 커서 스택에 넣을 수 없습니다.히프를 사용하는 것을 검토해 주세요.
int *sieve = malloc(2000000 * sizeof(*sieve));
스택 사이즈를 변경하는 경우는, 이 문서를 참조해 주세요.
힌트: - 더 이상 필요하지 않을 때는 동적으로 할당된 메모리를 해방하는 것을 잊지 마십시오.
3가지 방법이 있습니다.
- 힙에 어레이 할당 - 사용
malloc()
다른 포스터에서 제안했듯이.잊지 말고free()
(다만)main()
그다지 중요하지 않습니다.프로그램 종료 시 OS가 메모리를 청소합니다.) - 어레이를 유닛 레벨로 선언합니다.데이터 세그먼트에 할당되어 모든 사용자에게 표시됩니다(추가).
static
선언에 대한 가시성이 유닛으로 제한됩니다). - 어레이를 다음과 같이 선언합니다.
static
- 이 경우 데이터 세그먼트에 할당되지만 다음에서만 볼 수 있습니다.main()
.
스택이 아닌 힙에 할당하는 것이 좋습니다.
int main(int argc, char* argv[])
{
int * sieve;
sieve = malloc(20000);
return 0;
}
이는 약 7MB의 스택 공간입니다.비주얼 스튜디오에서는 /STACK:###,###을 사용하여 원하는 크기를 반영합니다.정말로 큰 스택(LISP를 사용하는 것도 좋은 이유일 수 있습니다.VirtualAlloc을 강제로 사용하기 전에 힙이 작은 할당으로 제한되어 있는 경우도 있습니다.또, /LARGE ADDRESSAURE(Visual Studio의 링커)를 사용해 빌드 하도록 PE를 설정할 수도 있습니다.하지만, 이 설정은 바이너리를 추가할 수 있도록 되어 있습니다.최대 4GB의 32비트 주소 공간(WOW64에서 실행 중인 경우)입니다.실제로 대규모 바이너리를 구축하려면 일반적으로 /bigobj를 추가 링커 파라미터로 설정해야 합니다.
또한 공간이 더 필요한 경우 (다시 MSVC 링크) /merge:와 같은 것을 사용하여 규칙을 완전히 위반할 수 있습니다.이것에 의해, 1개의 섹션을 다른 섹션으로 정리할 수 있기 때문에, 1개의 공유 코드/데이터 섹션에 모든 바이트를 사용할 수 있습니다.당연히 섹션 권한도 def 파일 또는 #pgrama로 설정해야 합니다.
malloc을 사용합니다.모두 반환 타입이 null이 아님을 확인합니다.null인 경우 시스템에 충분한 메모리가 없기 때문에 많은 값을 입력할 수 없습니다.
어레이가 엄청나네요.
사용하시는 머신이나 OS에 메모리가 없거나 할당이 필요한 경우가 있습니다.
배열을 꼭 할 수 (「」를 사용해 주세요).malloc(...)
메모리 누수의 위험이 있습니다.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★
malloc의 장점은 스택이 아닌 힙에 메모리를 할당하려고 한다는 것입니다(따라서 스택 오버플로는 발생하지 않습니다).
malloc에서 반환되는 값을 확인하여 할당이 성공했는지 실패했는지 확인할 수 있습니다.실패했을 경우는, 작은 어레이를 malloc 해 주세요.
다른 옵션은 즉석에서 크기를 조정할 수 있는 다른 데이터 구조(링크 목록 등)를 사용하는 것입니다.이 옵션은 데이터 처리 방법에 따라 달라집니다.
그러나 다른 옵션은 파일을 저장하여 데이터를 즉시 스트리밍하는 것입니다.이 방법이 가장 느립니다.
하드 드라이브의 스토리지를 사용하는 경우 기존 라이브러리(데이터베이스용)를 사용하는 것이 좋습니다.
Turbo C/C++는 16비트 컴파일러이므로 데이터형은 약 2바이트를 소비합니다.2bytes*2000000=40,00,000바이트=3.8147MB 공간
함수의 자동변수가 스택에 저장되어 스택메모리의 오버플로가 발생합니다.대신 데이터 메모리(스태틱 또는 글로벌 변수 사용) 또는 다이내믹히프 메모리(malloc/calloc 사용)를 사용하여 프로세서메모리 매핑의 가용성에 따라 필요한 메모리를 만듭니다.
alloca()를 사용하여 오브젝트의 실제 크기를 기준으로 스택프레임에서 필요한 공간을 할당할 수 없는 이유가 있습니까?
이렇게 해도 스택을 버스트할 경우 할당된 힙에 넣습니다.main()에서 static이라고 선언하지 않고 데이터 세그먼트에 넣는 것을 강력히 권장합니다.
만약 그것이 정말로 그렇게 커야 하고, 당신의 프로그램이 그것을 힙에 할당할 수 없다면, 당신의 프로그램은 정말로 그러한 종류의 기계에서 실행할 필요가 없다.
무엇을 달성하려고 하십니까?
언급URL : https://stackoverflow.com/questions/571945/getting-a-stack-overflow-exception-when-declaring-a-large-array
'source' 카테고리의 다른 글
MySQL 쿼리 / 절 실행 순서 (0) | 2022.10.20 |
---|---|
연결 배열 키 목록을 가져오는 중 (0) | 2022.10.20 |
요소를 다른 요소로 이동하려면 어떻게 해야 합니까? (0) | 2022.10.20 |
예외 발생 시 JavaScript 스택트레이스를 취득하려면 어떻게 해야 하나요? (0) | 2022.10.20 |
한 번의 ng클릭으로 여러 기능을 추가하는 방법 (0) | 2022.10.20 |