gpt4 book ai didi

c - "EXC_BAD_ACCESS: Unable to restore previously selected frame"错误,数组大小?

转载 作者:太空狗 更新时间:2023-10-30 03:49:48 26 4
gpt4 key购买 nike

我有一个算法可以创建埃拉托色尼筛法并从中提取素数。它允许您输入筛分的最大值,算法会为您提供低于该值的素数,并将它们存储在 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;

}

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

最佳答案

你没有溢出变量;你溢出了堆栈。当您创建类似 int myArray[500] 的数组时,您在堆栈上声明了 500 个 int。正常的堆栈大小为 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() 内存,否则你最终会泄漏。

关于c - "EXC_BAD_ACCESS: Unable to restore previously selected frame"错误,数组大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3051790/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com