由于C中缺少内存而导致分段错误

Tom*_*Tom 7 c linux ubuntu memory-management segmentation-fault

这段代码在一半的时间里给我分段错误:

int main(int argc, char **argv) {
    float test[2619560];
    int i;
    for(i = 0; i < 2619560; i++)
        test[i] = 1.0f;
}
Run Code Online (Sandbox Code Playgroud)

我实际上需要分配一个更大的数组,是否有某种方式允许操作系统允许我获得更多的内存?

我使用的是Linux Ubuntu 9.10

caf*_*caf 23

您正在溢出默认的最大堆栈大小,即8 MB.

您可以增加堆栈大小 - 例如.为32 MB:

ulimit -s 32767
Run Code Online (Sandbox Code Playgroud)

...或者您可以切换到分配malloc:

float *test = malloc(2619560 * sizeof test[0]);
Run Code Online (Sandbox Code Playgroud)

  • 如果你使用malloc,你可以检查代码是否成功分配 - 比运行分配并希望它不会崩溃要好得多.(附录,而不是评论@caf) (2认同)
  • @Sam Dufel请注意,即使您的内存不足,某些系统(例如默认情况下为linux)也可以从malloc返回非空指针 - 当您尝试访问该内存时会导致类似的崩溃. (2认同)

Jer*_*fin 6

现在你正在2619560*sizeof(float)堆栈上分配(或至少尝试)字节.至少在大多数典型情况下,堆栈只能使用有限数量的内存.您可以尝试定义它static:

static float test[2619560];
Run Code Online (Sandbox Code Playgroud)

这将它从堆栈中取出,因此它通常可以使用任何可用的内存.在其他函数中,定义某些东西会static改变语义,但在main它的情况下几乎没有区别(除了主要理论上的递归可能性main).