nfet schrieb:
> Das mit dem Overflow stimmt, hätte da aber nicht schon früher ein
> Fehler kommen müssen?
Nicht jeder Array-Overrun führt automatisch zu einem
Speicherzugriffsfehler. Liegt das Array nicht ganz am Ende des
prozesseigenenen Speicherbereichs, kann das Programm ungestraft auch
noch ein Stück über das Array-Ende hinaus schreiben oder lesen.
> Und kann man das nicht mit einem int a[N+1]; beheben?
Ja.
> if (a[i]) könnte man auch als if (!(a[i] == 0)) schreiben oder in diesem
> Fall auch als if (a[i] == 1).
Da die Array-Elemente sowieso nur zwei unterschiedliche Werte annehmen
können, kannst du es auch als bool deklarieren (dazu stdbool.h
includen). Gibst zu dem Array a dann noch einen treffenden Namen (z.B.
prime, isPrime o.ä.), passt auch die If-Abfrage ohne expliziten
Vergleich:
Übrigens müssen beim Sieb des Eratosthenes für i nur Zahlen kleiner √N
berücksichtigt werden, um alle Primzahlen bis N zu ermitteln. Der äußere
Schleifenkopf kann damit auch so aussehen
was die Sache sehr viel schneller macht.