首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >"EXC_BAD_ACCESS:无法还原先前选定的帧“错误,数组大小?

"EXC_BAD_ACCESS:无法还原先前选定的帧“错误,数组大小?
EN

Stack Overflow用户
提问于 2010-06-16 16:44:59
回答 4查看 5.3K关注 0票数 5

我有一个算法来创建Eratosthenes的筛子并从中提取素数。它允许您输入筛子的最大值,算法会给出该值以下的素数,并将这些素数存储在c样式的数组中。

问题:当值不超过500.000时,一切都可以正常工作,但是当我在-while中输入一个较大的值时-它在xcode中给出了以下错误消息:

代码语言:javascript
复制
Program received signal:  “EXC_BAD_ACCESS”.
warning: Unable to restore previously selected frame.
Data Formatters temporarily unavailable, will re-try after a 'continue'. (Not safe to call dlopen at this time.)

我的第一个想法是我没有使用足够大的变量,但由于我使用了'unsigned long long int',这应该不是问题所在。此外,调试器会将我指向代码中的一个点,数组中的一个点会被赋值。因此,我想知道数组是否有最大限制?如果是:我应该改用NSArray吗?如果不是,那么根据此信息,是什么导致了此错误?

编辑:这是代码的样子(它不完整,因为它在发布的最后一行失败)。我正在使用垃圾收集。

代码语言:javascript
复制
/*--------------------------SET UP--------------------------*/
    unsigned long long int upperLimit = 550000;             // 
    unsigned long long int sieve[upperLimit];
    unsigned long long int primes[upperLimit];
    unsigned long long int indexCEX;
    unsigned long long int primesCounter = 0;

// Fill sieve with 2 to upperLimit
for(unsigned long long int indexA = 0; indexA < upperLimit-1; ++indexA) {
        sieve[indexA] = indexA+2;
}


unsigned long long int prime = 2;

/*-------------------------CHECK & FIND----------------------------*/
while(!((prime*prime) > upperLimit)) {

    //check off all multiples of prime
    for(unsigned long long int indexB = prime-2; indexB < upperLimit-1; ++indexB) {

        // Multiple of prime = 0
        if(sieve[indexB] != 0) {
            if(sieve[indexB] % prime == 0) {
                sieve[indexB] = 0;
            }
        }
    }

    /*---------------- Search for next prime ---------------*/
    // index of current prime + 1
    unsigned long long int indexC = prime - 1;

    while(sieve[indexC] == 0) {
        ++indexC;
    }
    prime = sieve[indexC];

    // Store prime in primes[]
    primes[primesCounter] = prime; // This is where the code fails if upperLimit > 500000
    ++primesCounter;

    indexCEX = indexC + 1;

}

正如你可能看到或没有看到的那样,我是-very much-一个初学者。当然,欢迎任何其他建议:)

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-06-16 23:50:23

您没有溢出变量;而是溢出了堆栈。当您创建一个像int myArray[500]这样的数组时,您在堆栈上声明了500个int。正常的堆栈大小为8 MB。仅您的两个数组就大约有8.4MB (8字节* 550000 / (1024^2) =4.2MB)。您应该在这里使用堆内存(来自malloc())。所以它应该是这样的:

代码语言:javascript
复制
int upperLimit = 550000;
unsigned long long *sieve = malloc(sizeof(long long) * upperLimit);
unsigned long long *primes = malloc(sizeof(long long) * upperLimit);
unsigned long long indexCEX;
unsigned long long primesCounter = 0;

别忘了,当你使用完内存时,你需要free()它,否则你最终会泄漏内存。

票数 7
EN

Stack Overflow用户

发布于 2010-06-16 23:38:22

您正在使用堆栈上分配的数组。如果使用动态内存分配,您可能会分配更多内存:

代码语言:javascript
复制
/* program setup */
unsigned long long *sieve = malloc(sizeof(*sieve) * upperLimit);
unsigned long long *primes = /* -- "" -- */
/* etc, free() at program end */

您的OS X系统上的堆栈限制可能是8 MiB。如果您的系统是sizeof(unsigned long long) == 8,那么您的堆栈中将包含两个500000元素的数组,而不是两个550000元素的数组。

票数 2
EN

Stack Overflow用户

发布于 2010-06-16 17:44:16

据我所知,当您尝试使用已释放的内存时,会收到"EXC_BAD_ACCESS“。要调试它,可以使用NSZombie类。这可能会有所帮助:http://www.cocoadev.com/index.pl?DebuggingAutorelease

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3051790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档