C 大小为2^25的数组

C 大小为2^25的数组,c,arrays,time,swap,C,Arrays,Time,Swap,我试图在c中创建一个大小为2^25的数组,然后对其执行一些基本操作(memsweep函数)。c代码是 #include <stdio.h> #include <time.h> #define S (8191*4096) main() { clock_t start = clock(); unsigned i; volatile char large[S];

我试图在c中创建一个大小为2^25的数组,然后对其执行一些基本操作(memsweep函数)。c代码是

#include <stdio.h>
#include <time.h>
#define S (8191*4096)
main()
{
                clock_t start = clock();
                unsigned i;
                volatile char large[S];
                for (i = 0; i < 10*S; i++)              
                large[(4096*i+i)%S]=1+large[i%S];

                printf("%f\n",((double)clock()-start)/CLOCKS_PER_SEC);
}
#包括
#包括
#定义S(8191*4096)
main()
{
时钟启动=时钟();
未签名的i;
挥发性炭大[S];
对于(i=0;i<10*S;i++)
大[(4096*i+i)%S]=1+大[i%S];
printf(“%f\n”,((双)时钟()-start)/每秒时钟数);
}

我可以编译它,但在执行时会出现分段错误。

可能比堆栈大。你可以

  • 使
    变大
    全局
  • 使用
    malloc

阵列太大,无法放入堆栈中。将堆与
char*large=malloc(S)
一起使用。

您没有太多的堆栈空间来分配这么大的数组。。。例如,在Linux上,堆栈大小通常为8192字节。你肯定已经超过了

最好的选择是使用
malloc()
在堆上分配内存。因此,您可以编写
char*large=malloc(S)。您仍然可以使用
[]
符号访问阵列


或者,如果您在Linux上,您可以在命令行上调用
sudoulimit-sx
,其中X是一个足够大的数字,足以让您的数组容纳在堆栈中。。。但我通常不鼓励这种解决方案。

在堆栈上分配了大量资源,而您正在使其溢出


尝试使用
char*large=malloc(S)

它比堆栈大!请尝试“char*larger=malloc(S)”而不是使用静态缓冲区。@很可能是selbie,但堆栈的大小是由实现定义的:)为了完整性:如果您一心想在堆栈上使用数组,编译器允许您在编译时指定堆栈大小。我不是在建议这种方法,而是在招致其他开发人员的愤怒@hackworks这将是一个坏主意,因为您的堆栈是固定大小的,并在每个线程的生命周期内保留。假设程序执行的不仅仅是这个循环,那么您只需要保留无法使用的内存。