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

时间:2010-11-19 00:05:30

标签: c linux ubuntu memory-management segmentation-fault

此代码在大约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

4 个答案:

答案 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”获得它。