[英]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.