2014-09-27 2 views
0

우분투 최대 스택 크기 위에 스택 사이즈 (최대 8메가바이트)를 초과 할 경우에도 상기 프로그램의 8메가바이트스택 오버플로가 발생하지 않는 이유는 무엇입니까?

#include <stdlib.h> 
#include <stdio.h> 
#include <string.h> 
int main() 
{ 
    int abc[2048002]; 
    memset(abc,0,2048002*4); 

} 

, 난, 8메가바이트 이상을 할당 한 것이다 바와 같이

ulimit -a 

core file size   (blocks, -c) 0 
data seg size   (kbytes, -d) unlimited 
scheduling priority    (-e) 0 
file size    (blocks, -f) unlimited 
pending signals     (-i) 62202 
max locked memory  (kbytes, -l) 64 
max memory size   (kbytes, -m) unlimited 
open files      (-n) 1024 
pipe size   (512 bytes, -p) 8 
POSIX message queues  (bytes, -q) 819200 
real-time priority    (-r) 0 
stack size    (kbytes, -s) 8192 
cpu time    (seconds, -t) unlimited 
max user processes    (-u) 62202 
virtual memory   (kbytes, -v) unlimited 
file locks      (-x) unlimited 

, 세분화 오류가 발생하지 않습니다. 그럼 내가 왜 위의 시나리오에서 스택 오버플로가 안되는지 설명 할 수 있습니까?

+1

전체 프로그램이 최적화되지 않았습니까? –

+1

memset을 수행하지 않으면 메모리가 할당되지 않습니다. 스택 오버플로를받을 memset을 수행하십시오 –

+0

1. 스택 크기는 8M이 아니라 8K입니다. 2. * nix 시스템은 당신이 그것을 (읽기/쓰기) 시도하지 않는 한 실제로 메모리를 할당하지 않습니다. 그래서 memset 또는 printf해야합니다. 3. 스택이 아닌'heap'에 할당하고 있습니다. – texasbruce

답변

2
stack size    (kbytes, -s) 8192 

이것은 8192 킬로바이트 또는 8 메가 바이트입니다.

+0

수학이 옳다면 스택을 날려 버릴 것이라고 말하는 겁니까? –

+0

오, 죄송합니다. 그의 수학은 조금 벗어난 것이 아닙니다. 그것은 많이 벗어났다. –

+0

int abc [2048000], 세그먼트 화 오류를 발생시키는 것보다 1 바이트를 초과하는 경우 최대 4 * 2048000 바이트를 할당 할 수 있음을 의미합니까? 하지만 제 경우에는 그렇지 않습니다. 우리가 최대 한도를 초과하여 1 바이트를 늘리는 경우에도 왜 그렇게 행동하지 않는지 설명 할 수 있습니까? – NAVEEN

관련 문제