我正在尝试时间并比较排序算法。据我所知:sizeof(int)
是4个字节,因此int array[one million];
产生(4)百万字节,大概是4,000 kb或4mb。
那我为什么不能呢?我很确定我还有更多。准确地说是2gb。
如果这意味着什么,我正在使用gcc。
答案 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)
强烈建议大型变量应通过malloc
或new
转到堆中。但是,通过增加堆栈大小,您仍然可以在堆栈中拥有如此大的数组。当您可以进行极深度递归时,通常需要这样做。
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
。