此代码在大约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
答案 0 :(得分:23)
您正在溢出默认的最大堆栈大小,即8 MB。
您可以增加堆栈大小 - 例如。为32 MB:
ulimit -s 32767
...或者您可以使用malloc
切换到分配:
float *test = malloc(2619560 * sizeof test[0]);
答案 1 :(得分:6)
现在你正在堆栈上分配(或至少尝试)2619560*sizeof(float)
个字节。至少在大多数典型情况下,堆栈只能使用有限数量的内存。您可以尝试定义它static
:
static float test[2619560];
这会将其从堆栈中取出,因此它通常可以使用任何可用内存。在其他函数中,将事物定义为static
会改变语义,但在main
的情况下,它几乎没有区别(除了递归main
的理论上可能性之外)。
答案 2 :(得分:1)
不要将如此大的物体放在堆叠上。相反,考虑通过malloc()或其朋友的分配将其存储在堆中。
2.6M浮点数并不多,即使在32位系统上,你也可以使用地址空间。
如果需要分配一个非常大的数组,请务必使用64位系统(假设您有足够的内存!)。 32位系统每个进程只能处理大约3G,即便如此,您也无法将其全部分配为一个连续的块。
答案 3 :(得分:0)
这是堆栈overflower。 你最好使用malloc函数来获得比堆栈大小更大的内存,你可以从“ulimit -s”获得它。