المشكلة هي أنك تهب المكدس بعيدًا.
unsigned long i;
int candidatePrimes[CANDIDATE_PRIMES];
إذا كان Covilidate_Primes كبيرًا ، فإن هذا يغير مؤشر المكدس بمبلغ ضخم. لكنها لا تلمس الذاكرة فقط يعدل مؤشر المكدس بمقدار كبير جدًا.
for (i=0;i<CANDIDATE_PRIMES;i++)
{
هذا يعدل "أنا" الذي يعود إلى منطقة جيدة من المكدس ، ويضعه على الصفر. يتحقق من أنه <canneridate_primes ، وهو ، وبالتالي يؤدي التكرار الأول.
printf("i: %d\n", i); // does not print; bus error occurs first
هذا يحاول وضع المعلمات لـ "printf" على أسفل المكدس. فقاعة. موقع ذاكرة غير صالح.
ما هي القيمة التي يمتلكها Covilidate_Primes؟
وهل أنت في الحقيقة هل تريد تخزين جميع الأعداد الأولية التي تختبرها أو فقط تلك التي تمر؟ ما هو الغرض من تخزين القيم 0 من خلال Covilident_primes بالتتابع في صفيف ؟؟؟
إذا كان ما أردت فقط تخزين الأعداد الأولية ، فيجب عليك استخدام تخصيص ديناميكي وتنموه حسب الحاجة.
size_t g_numSlots = 0;
size_t g_numPrimes = 0;
unsigned long* g_primes = NULL;
void addPrime(unsigned long prime) {
unsigned long* newPrimes;
if (g_numPrimes >= g_numSlots) {
g_numSlots += 256;
newPrimes = realloc(g_primes, g_numSlots * sizeof(unsigned long));
if (newPrimes == NULL) {
die(gracefully);
}
g_primes = newPrimes;
}
g_primes[g_numPrimes++] = prime;
}