在C中使用malloc的矩阵分配是否有限制?

时间:2014-03-14 08:30:29

标签: c matrix malloc

我正在使用动态分配,因为我需要一些内存空间来定义3个矩阵。当我使用2个矩阵时(请参阅下面的最小工作环境),即我将第三个矩阵作为注释,程序运行良好并给出了期望的结果。但是,当我包含第三个矩阵时,我得到一个分段错误,核心被丢弃!我不知道使用malloc的动态分配是否有限制。任何帮助将受到高度赞赏。谢谢!

#include<stdio.h>
#include<malloc.h>

int main(int argc, char **argv)
{
    int rows=160, cols=1999000;

    float *mat1 = (float *)malloc(rows * cols * sizeof(float));
    float *mat2 = (float *)malloc(rows * cols * sizeof(float));
    //float *mat3 = (float *)malloc(rows * cols * sizeof(float));

    int i, j;

    for(i=0;i<rows;i++) 
    {
        for(j=0;j<cols;j++) 
        {
            mat1[i * cols + j]=i+j;
        mat2[i * cols + j]=i-j;
        //mat3[i * cols + j]=i*j;
        }
    }

    for(i=0;i<2;i++) 
    {
        for(j=0;j<6;j++) 
        {
            printf("R[%d][%d] = %f\n", i, j, mat2[i * cols + j]); 
        }
    } 
}

3 个答案:

答案 0 :(得分:2)

最有可能如评论中所述,你的内存不足。 检查mallocs的返回:我的猜测是你的第3个分配返回NULL,当你试图影响它的值时会触发segfault。

<强> [编辑]

float *mat3 = (float *)malloc(rows * cols * sizeof(float));
if(mat3 == NULL)
{
    printf("Not enough memory");
    return ENOMEM;
}

<强> [EDIT2]

正如评论中所说,使用malloc强制你获得连续的内存。考虑到您需要的大量空间,这种设计可能不合适。例如,您可能希望使用链接列表,这样可以“分割”您的内存。

无论如何,请确保您的硬件配置(可用内存)可以支持您想要执行的代码。

答案 1 :(得分:2)

首先,您尝试为每个malloc分配1 249 375字节(大约1.2 GiB),即使有足够的可用内存也可能会失败,因为可能没有此大小的连续内存块记忆碎片。

其次,如果你的程序是32位,那么在Linux上,根据你的内核和设置,单个进程最多可以使用3-4 GiB的内存(很可能是3)。由于您为3个呼叫分配了多于1个GiB,因此可能超出此限制。在Windows上,32位进程默认情况下最多可使用2 GiB,使用4-Gigabyte Tuning时最多可使用3 GiB。对于64位程序,这些限制要大得多,但由于内存碎片,您的分配仍然会失败。

从底线开始,您应该了解这些限制并检查malloc的返回值。

答案 2 :(得分:1)

您正在请求

3个矩阵的

7.14898109436 GB内存..你的电脑有这么多内存吗?

因此,对于您的应用程序,内存需求非常大,因此您的问题是3个矩阵

(我的计算是否正确?:))

https://www.google.com/search?q=1999000*160*8*3bytes+in+gb