如何修复我的c程序中的内存错误?

时间:2011-07-20 10:05:57

标签: c memory-management

显示错误,因为数组大小太大,结构大小太大,文件中定义的全局数据太多。请告诉我如何分配动态内存?

struct
{
   doublereal a[25000000];

} _BLNK__;
static doublereal x[22500]  /* was [3][7500] */;

static doublereal vn[12], del, eul[22500]   /* was [3][1500] */;

4 个答案:

答案 0 :(得分:2)

在堆上分配数据,而不是在堆栈上。使用指针并在初始化例程中分配内存。

另外,如果你有足够的内存,可以做一些计算。 25000000 * 16字节=> 400MB的内存。 (不知道doublereal有多大。)

答案 1 :(得分:0)

尝试使用malloc和指针进行动态内存分配:

typedef struct
{
   doublereal a[25000000];    
} _BLNK__;    
...
{    
_BLNK__ *mypointer = malloc(sizeof*mypointer);
mypointer->a[0] = 0;
mypointer->a[1] = 1;
...
free(mypointer);
}
...

答案 2 :(得分:-1)

#include <stdlib.h>

#define LEN_A (25000000)
struct
{
   doublereal* a;

}_BLNK__;

#define LEN_X (22500)
#define LEN_VN (12)
#define LEN_EUL (22500)


#define INIT_BLNK(x) x.a=(doublereal*)malloc(LEN_A*sizeof(doublereal))
#define FREE_BLNK(x) if(x.a!=0)free(x.a)

static doublereal *x;
static doublereal *vn,del,*eul;

int main()
{
   _BLNK__ Item;

   x = (doublereal*)malloc(LEN_X*sizeof(doublereal));
   vn = (doublereal*)malloc(LEN_VN*sizeof(doublereal));
   eul = (doublereal*)malloc(LEN_EUL*sizeof(doublereal));


   INIT_BLNK(Item);

   //Do whatever you wish


   //Return memory to the OS
   free(x);
   free(vn);
   free(eul);

   FREE_BLNK(Item);

   return 0;
}

尝试使用此功能。我刚刚在这里编写了代码,所以如果有任何编译器错误,请尝试修复它们

答案 3 :(得分:-1)

声明

doublereal a[25000000];

在堆栈上分配内存。堆栈的大小有严格的限制,你可以通过运行在linux或osx系统上找到它:

$ ulimit -s
8192

是8192K = 8M。

您正尝试在32位系统上分配25000000 * 8 = 200000000字节= 190 M,这远远大于限制。

您有三种选择:

1)减小数组的大小

2)动态分配内存(doublereal *a = (doublereal *)malloc(sizeof(doublereal) * 25000000)

3)增加堆栈大小(但这需要在该程序将运行的所有计算机上具有管理权限)