Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修复我的c程序中的内存错误?_C_Memory Management - Fatal编程技术网

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

如何修复我的c程序中的内存错误?,c,memory-management,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] */; 在堆上而不是堆栈上分配数据。在初始化例程中使用指针并分配内存 另外,进行一些计算以确

它显示的错误包括数组太大、结构太大、文件中定义的全局数据太多。请告诉我如何分配动态内存

struct
{
   doublereal a[25000000];

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

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

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

另外,进行一些计算以确定您是否有足够的内存,例如25000000*16字节=>400MB的内存。不知道doublereal有多大

试着用这个。我刚刚在这里编写了代码,因此如果有任何编译器错误,请尝试修复它们

doublereal a[25000000];
在堆栈上分配内存。堆栈的大小有严格限制,您可以通过运行以下命令在linux或osx系统上找到它:

$ ulimit -s
8192
这是8192K=8M

您试图在32位系统上分配25000000*8=2000000000字节=190m,这远远大于限制

你有三个选择:

1减小阵列的大小

2动态分配内存doublereal*a=doublereal*mallocsizeofdoublereal*25000000


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

尝试使用malloc和类似指针的动态内存分配:

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

虽然这和做某事一样简单。。。自由物;,我怀疑一定有更好的方法,而不是执行这样一个内存不足的程序…这是结构定义的一部分,不一定在堆栈上分配。此外,增加最大堆栈大小不需要在大多数机器上具有管理权限。例如,在Linux上,我可以很容易地编写一个程序,将其堆栈切换到堆分配的块。在debian linux上,默认情况下,堆栈大小没有硬限制。用户可以覆盖软限制。如果出现错误,必须在堆栈上分配结构。如果是堆分配的,在大多数系统上,这不会导致原始问题。doublereal在32位平台上的大小为8字节。25000000 doublereals数组的大小为25000000 B*8=20000000 B~195312 KB~190MWhoops,读错了-一直认为这是一个BLNK数组-不过,这不是堆栈内存,因为它声明为静态。请正确缩进。当给出示例代码作为答案时,这一点尤为重要!你并没有解决真正的问题:这只是一个非常非常大的2D数组。另外,如果语句不能放在括号内。为什么不使用函数而不是定义?如果做不到这一点,请使用do{…}while0模式使其成为一个正确的语句。是的,我应该制作FREE_BLNKx ifx.a=0freex。也必须在开始时声明一个项目,因为它是C。在我的辩护中,正如我所说,它就写在这里,没有尝试编译它,现在正在编辑。调用函数比使用宏内联代码要慢。实际上,内联函数可以和宏一样快,而且编写起来也容易得多:学会接受内联静态!编译器不保证内联静态是内联的,至少我记得,在vc++文档中,它在我知道的某个地方声明了一个事实,我也很失望:p,uu forceinline应该保证是内联的,但我也在某个地方读过,在优化过程中,还可以将其转换为vc++文档中未说明的常规函数调用。忽略前面的语句,因为我在C++中使用内联,而前面只表示了乐趣,我不知道C有内联函数。
typedef struct
{
   doublereal a[25000000];    
} _BLNK__;    
...
{    
_BLNK__ *mypointer = malloc(sizeof*mypointer);
mypointer->a[0] = 0;
mypointer->a[1] = 1;
...
free(mypointer);
}
...