2013-03-01 46 views
1

如果我將行的值保持爲100000,程序可以正常工作,但是如果我將100萬行設置爲1000000,程序會給我分段錯誤。是什麼原因?我在Linux 2.6x RHEL內核上運行。是什麼導致以下程序中的段錯誤

#include<stdio.h> 

#define ROWS 1000000 
#define COLS 4 

int main(int args, char ** argv) 
{ 
    int matrix[ROWS][COLS]; 

    for(int col=0;col<COLS;col++) 
    for(int row=0;row < ROWS; row++) 
    matrix[row][col] = row*col; 

    return 0; 
} 
+3

堆棧溢出Stackoverflow ... – Mysticial 2013-03-01 19:47:47

+0

可悲的是沒有辦法在編譯時捕獲這樣的分配失敗。儘量使用盡可能小的數組。如果你不確定,那麼可能你沒有足夠的堆棧空間;-) – 2013-03-01 20:01:28

回答

1

您的系統不允許您進行較大的堆棧分配。使全局或使用動態分配matrix(通過mallocfree),你應該沒問題。

3

matrixmain函數中的局部變量。因此它在機器調用堆棧上「分配」。

這個堆棧有一些限制。

你應該讓你的matrix全局或static變量或使其指針和堆分配(例如帶或callocmalloc)的存儲區。不要忘記,callocmalloc可能會失敗(通過返回NULL)。

堆分配這樣一個事情的一個更好的理由是矩陣的維度應該是一個變量或一些輸入。連接源代碼中的維度的原因很少。

啓發式:沒有局部變量的大小(局部變量的累積和)大於一個或兩個千字節。

[當然,也是有效的例外啓發式]

2

您正在分配堆棧變量,每個節目的棧是有限的。

當你嘗試分配太多的堆棧內存時,你的內核會通過發送一個SEGV信號來殺死你的程序,也就是分段錯誤。

如果你想分配更大的內存塊,使用malloc,這個函數將從堆中獲取內存。