我正在使用动态分配,因为我需要一些内存空间来定义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]);
}
}
}
答案 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个矩阵
(我的计算是否正确?:))