我正在尝试在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);
}
我能够编译它,但在执行时会产生分段错误。
答案 0 :(得分:9)
这可能比你的筹码更大。你可以
large
全球malloc
答案 1 :(得分:4)
数组太大,无法放入堆栈。请将堆与char *large = malloc(S)
一起使用。
答案 2 :(得分:3)
你没有那么多的堆栈空间来分配一个大的数组...例如,在Linux上,堆栈大小通常是8192字节。你肯定超过了那个。
最好的选择是使用malloc()
在堆上分配内存。所以你会写char* large = malloc(S);
。您仍然可以使用[]
表示法访问数组。
可选地,如果你在Linux上,你可以在命令行上调用sudo ulimit -s X
,其中X是一个足够大的数字,以便你的数组适合堆栈...但我通常不鼓励这个解决方案
答案 3 :(得分:3)
正在堆栈上分配大量而你正在溢出它。
尝试使用char *large = malloc(S)