EXC_BAD_ACCESS:分配的内存太多了?

时间:2013-09-03 13:30:23

标签: c memory-management exc-bad-access

我注意到在Xcode中用C编程有些麻烦。 如果我尝试使用下面定义的维度分配这三个数组:

#define MAX_NUM_VALID 12000
#define ALT_MAX       200000

{
...
double            l_adYMLinkedData[MAX_NUM_STAR_VALID + ALT_MAX][1];
double            l_adZMLinkedData[MAX_NUM_STAR_VALID + ALT_MAX][1];
double            l_adMLinkedData[MAX_NUM_STAR_VALID + ALT_MAX][1];
...
}

Xcode在运行时返回错误说明:

EXC_BAD_ACCESS (code=2, address:.....)

我无法弄清楚为什么。如果我限制这些尺寸(即100和100),一切都很顺利。

有什么想法吗?

2 个答案:

答案 0 :(得分:0)

尝试放入堆栈(这往往是一个相对有限的资源)是非常多的东西。

您可能想尝试进行动态分配,例如使用malloc

double *l_adYMLinkedData = malloc ((MAX_NUM_STAR_VALID+ALT_MAX)*sizeof(double));
// check and use it
free (l_adYMLinkedData);

这实际上给了你同样的东西。与sizeof之类的指针/数组差异有微妙的区别,但如果您所做的只是索引,它们通常不会发挥作用。

答案 1 :(得分:0)

堆栈空间通常是有限的(在Visual Studio的情况下默认为4 MB)。每个数组占用近1.6 MB,并且当它试图进一步分配时,堆栈的空间不足。

在堆上分配它们,然后释放它们以避免内存泄漏。