Das Problem ist, dass Sie den Stapel wegblasen.
unsigned long i;
int candidatePrimes[CANDIDATE_PRIMES];
Wenn Candidate_primes groß ist, verändert dies den Stapelzeiger um eine massive Menge. Aber es berührt das Gedächtnis nicht, es nur Passt den Stapelzeiger um eine sehr große Menge an.
for (i=0;i<CANDIDATE_PRIMES;i++)
{
Dies passt "I" an, was weit zurück im guten Bereich des Stapels ist und es auf Null setzt. Überprüft, ob es <Candidate_Primes ist, was es ist, und somit die erste Iteration durchführt.
printf("i: %d\n", i); // does not print; bus error occurs first
Dies versucht, die Parameter für "printf" auf den Boden des Stapels zu setzen. BOOM. Ungültiger Speicherort.
Welchen Wert hat Candidate_Primes?
Und du machst du? eigentlich Möchten Sie alle Primzahlen speichern, die Sie testen oder nur die, die passieren? Was ist der Zweck, die Werte 0 bis Candidate_Primes nacheinander in einem Array zu speichern ???
Wenn Sie nur die Primzahlen speichern wollten, sollten Sie eine dynamische Zuordnung verwenden und nach Bedarf ausbauen.
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;
}