繁体   English   中英

如何修复 c 程序中的 memory 错误?

[英]How to fix memory bug in my c program?

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

struct
{
   doublereal a[25000000];

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

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

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

此外,如果您有足够的 memory 例如 25000000 * 16 字节 => 400MB 的 memory,请进行一些计算。 (不知道doublereal有多大)。

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

typedef struct
{
   doublereal a[25000000];    
} _BLNK__;    
...
{    
_BLNK__ *mypointer = malloc(sizeof*mypointer);
mypointer->a[0] = 0;
mypointer->a[1] = 1;
...
free(mypointer);
}
...
#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;
}

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

该声明

doublereal a[25000000];

在堆栈上分配 memory。 堆栈的大小有严格的限制,您可以在 linux 或 osx 系统上通过运行以下命令找到它:

$ ulimit -s
8192

即 8192K = 8M。

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

你有三个选择:

1) 减小数组的大小

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM