在C中使用malloc进行矩阵分配有什么限制吗?

在C中使用malloc进行矩阵分配有什么限制吗?,c,matrix,malloc,C,Matrix,Malloc,我使用动态分配,因为我需要一些内存空间来定义3个矩阵。当我使用2个矩阵时(请参见下面的最小工作环境),即我将第三个矩阵作为注释,程序运行得非常好,并给出了期望的结果。然而,当我包含第三个矩阵时,我得到了一个分段错误,核心转储!我不知道使用malloc的动态分配是否有限制。任何帮助都将不胜感激。谢谢大家! #include<stdio.h> #include<malloc.h> int main(int argc, char **argv) { int rows=

我使用动态分配,因为我需要一些内存空间来定义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]); 
        }
    } 
}
#包括
#包括
int main(int argc,字符**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;

对于(i=0;i,很可能如评论中所述,您的内存不足。 检查mallocs的返回:我猜您的第三次分配返回
NULL
,当您试图影响它的值时,这会触发segfault

[编辑]

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

float *mat3 = (float *)malloc(rows * cols * sizeof(float));
if(mat3 == NULL)
{
    printf("Not enough memory");
    return ENOMEM;
}
同样如评论中所述,使用malloc会迫使您获得连续内存。考虑到您需要的巨大空间,这种设计可能不合适。例如,您可能希望使用链表,它允许您“分割”内存


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

很可能如注释中所述,您的内存不足。 检查mallocs的返回:我猜您的第三次分配返回
NULL
,当您试图影响它的值时,这会触发segfault

[编辑]

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

float *mat3 = (float *)malloc(rows * cols * sizeof(float));
if(mat3 == NULL)
{
    printf("Not enough memory");
    return ENOMEM;
}
同样如评论中所述,使用malloc会迫使您获得连续内存。考虑到您需要的巨大空间,这种设计可能不合适。例如,您可能希望使用链表,它允许您“分割”内存

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

您正在请求

7.14898109436
GB的内存用于3个矩阵..你的计算机有这么多内存吗

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

(我算对了吗?:)

您正在请求

7.14898109436
GB的内存用于3个矩阵..你的计算机有这么多内存吗

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

(我算对了吗?:)


首先,您试图为每个
malloc
分配1249 375字节(约1.2 GiB),即使有足够的可用内存,这也可能失败,因为由于内存碎片可能没有此大小的连续内存块

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


总之,您应该了解这些限制,并检查
malloc的返回值

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

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



总之,您应该了解这些限制,并检查
malloc

的返回值。自然限制当然是您的系统拥有的虚拟内存量。@JoachimPileborg但通常如何接受2个矩阵,而不接受3个矩阵?您是否有任何可以根据内存分配的数字?您进行的每个分配在您的示例程序中,e的大小远远超过1GB。进行三次分配的大小超过3.5GB(这比32位Windows计算机上可能具有的大小还要多)。此外,单次分配的内存必须是连续的,因此,即使您在一台64位计算机上有大量虚拟内存,也可能没有足够大的虚拟内存块。顺便说一句,请参阅自然限制当然是您的系统拥有的虚拟内存量。@JoachimPileborg但通常如何接受2个矩阵而不是3个矩阵不是??就内存而言,您有任何可以分配的数字吗?您在示例程序中进行的每个分配的大小都远远超过1 GB。进行三次分配的大小超过3.5GB(这比32位Windows计算机上可能具有的大小还要多)。此外,单个分配的内存必须是连续的,因此即使您在一台64位计算机上,并且有大量虚拟内存,也可能没有足够大的虚拟内存块。顺便说一句,请查看malloc的返回值。我添加了一个示例作为编辑谢谢您的帮助!是的,Coconop。没有足够的内存。有吗有这样一个内存的想法吗?我想我会使用除float之外的变量类型!是否可以定义变量大小(即使它是整数)以便我可以使用更多的空间momory?谢谢!!最好通过检查malloc的返回值。我添加了一个示例作为EDITTha