由于内存不足导致分割错误

这段代码给了我大约1/2的分段错误时间:

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

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

我正在使用Linux Ubuntu 9.10

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

    您可以增加堆栈大小 – 例如。 为32 MB:

     ulimit -s 32767 

    …或者你可以切换到malloc分配:

     float *test = malloc(2619560 * sizeof test[0]); 

    现在你在堆栈上分配(或者至少是试图) 2619560*sizeof(float)字节。 至少在大多数情况下,堆栈只能使用有限的内存。 您可以尝试将其定义为static

     static float test[2619560]; 

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

    不要把这么大的东西放在堆栈上。 相反,考虑将其存储在堆中,通过与malloc()或其朋友分配。

    2.6M的浮点数并不是那么多,即使在32位系统上,你也应该可以使用地址空间。

    如果您需要分配一个非常大的数组,请确保使用64位系统(假设您有足够的内存!)。 32位系统只能处理每个进程的3G,即使这样你也不能把它全部分配成一个连续的块。

    这是堆叠的花朵。 你最好使用malloc函数来获得大于栈大小的内存,你可以从“ulimit -s”中获取它。