【问题标题】:"EXC_BAD_ACCESS: Unable to restore previously selected frame" Error, Array size?“EXC_BAD_ACCESS:无法恢复先前选择的帧”错误,数组大小?
【发布时间】:2011-03-04 08:48:57
【问题描述】:

我有一个算法来创建 Eratosthenes 的筛子并从中提取素数。它允许您输入筛子的最大值,算法会为您提供低于该值的素数并将它们存储在 c 样式数组中。

问题: 值高达 500.000 时一切正常,但是当我输入一个大值时 - 在运行时 - 它在 xcode 中给我以下错误消息:

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 吗?如果不是,那么根据这些信息是什么导致了这个错误?

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

/*--------------------------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;

}

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

【问题讨论】:

  • 如果你发布代码,调试起来会容易得多。

标签: c objective-c arrays xcode exception


【解决方案1】:

我也有这个问题。原来我有循环。我无意中从自身内部调用了一个方法。

【讨论】:

  • 能否提供更多细节或示例?
  • 哦...一岁了。不幸的是,我什至不记得了。但如果你这样做 - (void) method { [self method]; }
【解决方案2】:

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

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() 内存,否则你最终会泄漏。

【讨论】:

    【解决方案3】:

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

    /* 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 元素的数组。

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 这与我的代码无关,因为我正在使用垃圾收集。无论如何谢谢:)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-27
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 1970-01-01
      相关资源
      最近更新 更多