【问题标题】:Array of size 2^25大小为 2^25 的数组
【发布时间】:2011-08-30 03:08:13
【问题描述】:

我正在尝试在 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);
}

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

【问题讨论】:

    标签: c arrays time swap


    【解决方案1】:

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

    • large设为全局
    • 使用malloc

    【讨论】:

    • 它比栈还大!尝试“char* large = malloc(S)”而不是使用静态缓冲区。
    • @selbie 最有可能,但堆栈的大小是实现定义的,所以.. :)
    【解决方案2】:

    数组太大而无法放入您的堆栈。将堆与char *large = malloc(S) 一起使用。

    【讨论】:

    • 为了完整起见:如果您一心想在堆栈上使用数组,编译器允许您在编译时指定堆栈大小。我不是在建议这种方法,而是会引起其他开发者的愤怒!
    • @hackworks 这将是一个坏主意,因为您的堆栈是固定大小的,并在每个线程的生命周期内保留。假设程序比这个循环做得更多,你只会保留你不能使用的内存。
    【解决方案3】:

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

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

    或者,如果您使用的是 Linux,您可以在命令行上调用 sudo ulimit -s X,其中 X 是一个足够大的数字,可以让您的阵列适合堆栈...但我通常不鼓励这种解决方案。

    【讨论】:

      【解决方案4】:

      在堆栈上分配了大块并且您正在溢出它。

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

      【讨论】:

        猜你喜欢
        • 2020-12-25
        • 1970-01-01
        • 2017-01-13
        • 2020-11-27
        • 2020-11-23
        • 2018-11-08
        • 2012-12-02
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多