不能分配超过一百万的整数

时间:2011-11-13 12:42:45

标签: c

我正在尝试时间并比较排序算法。据我所知:sizeof(int)是4个字节,因此int array[one million];产生(4)百万字节,大概是4,000 kb或4mb。

那我为什么不能呢?我很确定我还有更多。准确地说是2gb。

如果这意味着什么,我正在使用gcc。

4 个答案:

答案 0 :(得分:9)

你不能在堆栈上有那么多整数。

尝试在堆上为您的阵列分配空间。

int *array = malloc(1000000*sizeof(int));
// if array is not null, then you have an array with 1,000,000 ints.

完成排序算法后,释放数组:

free(array); // frees memory allocated before

答案 1 :(得分:4)

你可能正试图在堆栈上分配它,这很小。

  • 制作数组static或全局(确实相同但具有不同的可见性)

    static int arr[...]
    
  • 使用malloc

    int *p = malloc(... * sizeof *p);
    

答案 2 :(得分:2)

声明

int array[one million];

声明并将数组存储在Stack上。程序堆栈的大小非常小,不能包含100万个整数。 相反,你应该做的是在堆上声明数组。为此,创建一个指向数组的指针,并使用malloc()函数来分配内存。这样,内存就在堆上分配,并且你有更多的内存可供使用。

int *arrayName = malloc(1000000*sizeof(int));

您应该始终检查返回值的指针,因为malloc可能会失败,并且它将返回NULL值。如果您尝试访问此类指针,您的程序将突然终止。因此,请确保检查分配是否正确。

另外,请记住

free(arrayName);

使用完阵列后。否则,在某些更复杂的程序中,它可能会导致内存泄漏。

为了更好地理解Stacks和堆,请参阅此问题: What and where are the stack and heap?

答案 3 :(得分:0)

强烈建议大型变量应通过mallocnew转到堆中。但是,通过增加堆栈大小,您仍然可以在堆栈中拥有如此大的数组。当您可以进行极深度递归时,通常需要这样做。

Linux / gcc的堆栈默认大小为8MB,Windows为1MB。可以通过调整链接器选项或二进制文件来增加堆栈大小。

[已编辑] 例如,您可以在gcc中增加堆栈大小:

gcc -Wl,--stack,16777216 hello.c这仅适用于Windows上的MigW / cygwin gcc

所以,堆栈将是16MB。

此外,堆栈大小可以通过like修改命令ulimit(这是Linux中的简单方法):

ulimit -s 16777216

请注意ulimit -s将为您提供当前的堆栈大小。

最后,您可以在程序中致电setrlimit