1

可能重复:
声明大型数组时出现堆栈溢出异常

我的系统是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 <puts@plt>
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

4 回答 4

2

由于超出堆栈大小而导致的错误。为了摆脱这种情况,在堆中创建数组。为此,请使用malloc或其他动态内存分配功能。

int *a = malloc(N*N*sizeof(int))这种方式内存位于堆中。
此外,您应该通过检查来测试是否已为您分配了此内存:

if(a)
     // do stuff with a
于 2013-01-15T06:23:57.603 回答
1

是的,最大堆栈大小很小,大多数时候小于几个KBs。您正在尝试将数据分配1024*1024*sizeof(int)=4194304bytes4MBs单个堆栈分配中,这会导致崩溃。

有两种方法可以解决这个问题:

1)在栈外分配内存

#include<stdio.h>
#define N 1024

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

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

main()或 2)使用以下方法从堆内部动态分配内存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()任何动态分配的内存,否则您的程序会泄漏内存。

于 2013-01-15T06:25:35.160 回答
0

我想我不妨给出我的答案,从这里借来的:

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

现在您可以像访问原始代码中的二维数组一样访问它们;例如a[50][100] = 37;

当你完成它们时,free(a)不要忘记。free(b)

于 2013-01-15T07:13:37.550 回答
0

是的,在给定时间您可以在堆栈上分配多少是有限制的。它依赖于编译器。在 Visual Studio 上,默认大小为 1 MB。检查您的编译器设置以了解大小。我的猜测是,由于您超出了此限制,因此它正在崩溃。

于 2013-01-15T06:23:42.837 回答