2013-01-15 57 views
1

可能重複:
Getting a stack overflow exception when declaring a large array一個奇怪的分段錯誤

我的系統是x86-64 linux這裏是我的簡單代碼:

#include<stdio.h> 
#define N 1024 
int main() 
{ 
    int a[N][N]; 
    int b[N][N]; 
    printf("hello world\n"); 
    return 0; 
} 

而且從objdump的它的彙編代碼:

00000000004004fc <main>: 

4004fc: 55      push %rbp 
4004fd: 48 89 e5    mov %rsp,%rbp 
400500: 48 81 ec 00 00 80 00 sub $0x800000,%rsp 
400507: bf c4 05 40 00   mov $0x4005c4,%edi 
40050c: e8 cf fe ff ff   callq 4003e0 <[email protected]> 
400511: b8 00 00 00 00   mov $0x0,%eax 
400516: c9      leaveq 
400517: c3      retq 
400518: 0f 1f 84 00 00 00 00 nopl 0x0(%rax,%rax,1) 
40051f: 00 

奇怪的是這一計劃將打破調用printf()功能時。但是,如果我將N定義爲512,則此程序運行良好。我不知道爲什麼。是否有任何堆棧大小限制,限制堆棧使用內存?

有人知道爲什麼嗎?謝謝。

+4

有點諷刺在StackOverflow上問這個問題 – Nemo

+0

'ulimit -s'的輸出是什麼? – ThiefMaster

+0

把a'和'b' *定義在外面怎麼樣? –

回答

0

是的,有多少,你可以在給定時間對堆棧分配限制。它依賴於編譯器。在Visual Studio默認大小是1 MB。檢查您的編譯器設置以瞭解大小。我的猜測是因爲你超出此限制導致崩潰。

2

錯誤由於超過堆棧大小。爲了擺脫這種情況,在堆中創建數組。要做到這一點使用malloc或其他動態內存分配函數。

int *a = malloc(N*N*sizeof(int))這種方式內存位於堆中。
你也應該測試此內存已通過檢查分配給你:

if(a) 
    // do stuff with a 
+1

[不要在C中拋出malloc的返回](http://stackoverflow.com/questions/605845/) – Nemo

+0

並且C中沒有'new'。 – ThiefMaster

+0

據此編輯。感謝提醒@ThiefMaster。 – hmatar

1

是的,有一個最大堆棧大小是小的,大多數比一些小KBs時代。您正在嘗試分配數據的1024*1024*sizeof(int)=4194304bytes4MBs到這會導致崩潰的單一堆棧分配。

有2種方式來對付這個:

1)分配存儲器中的堆棧

#include<stdio.h> 
#define N 1024 

int a[N][N]; 
int b[N][N];  

int main() 
{ 
    printf("hello world\n"); 
    return 0; 
} 

以外或2)從堆中動態地分配內部main()存儲器使用malloc()

#include<stdio.h> 
    #define N 1024 

    int main() 
    { 
     int **a = malloc(N, sizeof(int*)); 
     int **b = malloc(N, sizeof(int*)); 
     for (int i=0; i<N; i++) 
     { 
      a[i]=malloc(N, sizeof(int)); 
      b[i]=malloc(N, sizeof(int)); 
     } 
     printf("hello world\n"); 
     return 0; 
    } 

注意:不要忘了free()任何動力LY分配的內存你用它保存的數據完成後,否則你的程序將導致內存泄漏。

+1

'int **'在這裏是非常錯誤的。 – Nemo

+0

@Nemo請解釋爲什麼請 –

+1

呃,在你編輯之前它是非常錯誤的:-)。原始代碼中的'a'和'b'衰變爲'int *',而不是'int **'。 – Nemo

0

我想我還不如給我的答案,從here借:

int (*a)[N] = malloc(N * N * sizeof(int)); 
int (*b)[N] = malloc(N * N * sizeof(int)); 

現在你可以像在你的原代碼二維數組訪問它們;例如a[50][100] = 37;

當你與他們所做的,不要忘了free(a)free(b)