Job*_*Job 5 c arrays xcode exception objective-c
我有一个算法来创建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.)
Run Code Online (Sandbox Code Playgroud)
我的第一个想法是我没有使用足够大的变量,但是当我使用'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;
}
Run Code Online (Sandbox Code Playgroud)
正如您可能会或可能不会看到的那样,我是一个非常初学者.当然欢迎任何其他建议:)
你没有溢出变量; 你堆满了.当您创建一个类似的数组时int myArray[500],您将int在堆栈上声明500 秒.正常堆栈大小为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;
Run Code Online (Sandbox Code Playgroud)
不要忘记,free()当你完成它或者你最终会泄漏时,你需要记忆.
| 归档时间: |
|
| 查看次数: |
5301 次 |
| 最近记录: |