2011-05-21 34 views
3

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

#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); 
} 

我能够编译它,但执行时它给出了分段错误。

+1

工作正常。 – 2011-05-21 07:18:47

回答

3

你没有太多的堆栈空间来分配一个大的数组......在Linux上,例如,堆栈大小通常是8192字节。你肯定超过了。

最好的选择是使用malloc()在堆上分配内存。所以你会写char* large = malloc(S);。您仍然可以使用[]表示法访问阵列。

(可选)如果你在Linux上,你可以在命令行调用sudo ulimit -s X,其中X是一个足够大的数目,足以让你的数组适合堆栈......但我通常会劝阻这个解决方案。

9

这可能比你的堆栈大。您可以

  • large全球
  • 使用malloc
+1

它比堆栈大!尝试“char * large = malloc(S)”而不是使用静态缓冲区。 – selbie 2011-05-21 07:19:07

+2

@selbie最有可能的,但堆栈的大小是实现定义,所以.. :) – cnicutar 2011-05-21 07:20:03

4

数组是太大,无法在栈上。改为使用char *large = malloc(S)堆。

+0

为了完整起见:如果你是在堆栈上使用数组,堆栈允许你在编译时指定堆栈大小时间。我不是在暗示这种方法,并且引起其他开发者的愤怒! – hackworks 2011-05-21 07:22:59

+0

@hackworks这将是一个坏主意,因为你的堆栈是固定的大小,并保留在每个线程的生命周期。假设程序做的不仅仅是这个循环,你只是留着你不能使用的内存。 – 2011-05-21 07:27:52

3

大堆被分配到堆栈上,并且溢出它。

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