分配和初始化大内存空间

时间:2015-09-03 22:07:38

标签: c memory memory-management malloc

我有以下功能:

float* Alocate2DBlankMemoryContinousSpace(int w, int h)
{
    float *matrix = (float*)malloc(w*h*sizeof(float));
    for (int i = 0; i<w*h; i++)
        matrix[i] = 0.0;
    return matrix;
}

用于2D中的分配向量。对于像w = 1000和h = 1000这样的小向量,它可以正常工作但是对于更大的向量,存在访问冲突写入位置存在问题,事实上我有很多可用内存要写。如何在连续记忆中分配和初始化大空间?

1 个答案:

答案 0 :(得分:2)

1000x1000 float(32位)缓冲区将使用4,000,000字节(3.8MiB),运行正常。我很好奇哪些值对你失败了,也许10000x10000会因为 381MiB 大小的缓冲区而失败,如果你在32位进程中运行我可以看到如果你将你的功能召唤3次或更多次,你可能会用完空间。

无论如何,你的代码中有一些坏习惯,首先是你没有检查分配是否成功,然后当calloc可能时你将自己的内存归零要快点如果分配失败malloc将返回NULL,但是当你自己将内存归零时,你仍然会取消引用指针。

请改为:

float* matrix = calloc( width * height, sizeof(float) );
if( matrix == NULL ) exit(1); // Bad-allocation, either terminate or fail gracefully and inform the user of the condition.
return matrix;