这段代码给了我大约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”中获取它。