2014-09-27 145 views
0

Ubuntu的爲什麼堆棧溢出不會發生?

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 

如上最大堆棧大小提到是8MB

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

} 

在上述程序中,我已分配超過8MB,即使在超過的堆棧大小(最大8MB),我沒有收到分段錯誤。所以任何人都可以解釋爲什麼我沒有在上面的情況下獲得堆棧溢出?

+1

你確定整個程序不只是優化了嗎? – 2014-09-27 16:17:21

+1

除非您執行memset,否則未分配內存。做memset你應該得到堆棧溢出 – 2014-09-27 16:21:17

+0

1.約翰說,堆棧大小是8M而不是8K。 2. * nix系統實際上並不分配內存,除非您嘗試訪問(讀取/寫入)它。所以應該做memset或printf。 3.你正在'heap'上分配,而不是'stack' – texasbruce 2014-09-27 16:33:12

回答

2
stack size    (kbytes, -s) 8192 

這是8192千字節或8兆字節。

+0

所以你說如果他的數學是正確的話會衝擊堆棧呢? – 2014-09-27 16:18:37

+0

哦,對不起。他的數學不只是一點點;它很多。 – 2014-09-27 16:20:03

+0

int abc [2048000],這意味着我們最多可以分配4 * 2048000個字節,如果我們超過一個字節多於它應該引發分段錯誤?但在我的情況下,這並沒有發生。你能解釋一下,爲什麼它不像我們增加一個字節超過最大限制 – NAVEEN 2014-09-27 16:47:15