2013-01-15 55 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)