Fehler mit malloc
-
Hallo,
also ich bin relativ neu mit C++ und versteh nicht ganz warum ich ein Programm zur Primfaktorzerlegung nicht einwandfrei zum Laufen bringe. Das Programm hab ich mit Arrays wunderbar zum Laufen gebracht, nur mit Pointern hackts wohl irgendwie.
Hier ist erstmal nur ein Unterprogramm, das alle Primzahlen zwischen 2 und einer eingegebenen Größe berechnet. Beim Ausführen werden sogar noch alle Primzahlen aufn Bildschirm wiedergegeben, dann aber diese Fehlermeldung: http://img6.imagebanana.com/img/0xu3o7pe/thumb/prim.png
#include <iostream> #include <math.h> #include <malloc.h> using namespace std; int main(){ int *p_lauf = NULL; int x, y, i, prim, a = 0; p_lauf = (int *) malloc(sizeof(int)*100000); if(p_lauf!=NULL){ cout << "Die zu zerlegende Zahl: "; cin >> x; cout << endl; /* Nun werden alle Primzahlen zwischen 2 und x ermittelt*/ for(i=2; i<=x; i++){ prim = 1; for(y=2; y<=sqrt((double)(i)) && prim==1; y++){ if(i%y==0) prim = 0; } if(prim==1){ *p_lauf = i; a = a+1; // a zählt die Anzahl der Einträge p_lauf = p_lauf + 1; } } p_lauf = p_lauf - a; //p_lauf wird um Anzahl der Einträge zurück gesetzt for(i=0; i<a; i++){ cout << *p_lauf << ' '; p_lauf = p_lauf+1; } }else cout << "FEHLER" << endl; free(p_lauf); return 0; }
Gibt es keine Möglichkeit die Anzahl von malloc reservierten Felder auch dynamisch zu verwalten? Also dass ich mich nicht von vornerein begrenzen muss mit höchstens (sizeof(int) * 10000) für die Primzahlen?
Danke fürs durchlesen etc:D
-
josefh schrieb:
Gibt es keine Möglichkeit die Anzahl von malloc reservierten Felder auch dynamisch zu verwalten? Also dass ich mich nicht von vornerein begrenzen muss mit höchstens (sizeof(int) * 10000) für die Primzahlen?
Nimm
std::vector
,malloc()
braucht man in C++ so gut wie nie. Hier ist ein guter Artikel zur Einführung in die STL.Wahrscheinlich läufst du mit
p_lauf = p_lauf - a;
vor den reservierten Speicher.
-
Danke für den Link, werd mich damit befassen.
p_lauf = p_lauf - a; bleibt aber im zulässigen Speicher.
-
Zu deinem Fehler:
Du veränderst p_lauf. Später wird also mit free eine andere Adresse freigegeben, als allokiert wurde. Das ist nicht erlaubt!Zu deinem Programm:
Der Code ist ziemlich schlimm. In welchem Buch wird denn für C++ malloc/free benutzt? Wenn man schon selber den Speicher verwalten muss, dann mit new/delete oder new[] delete[].
Besser wäre, wie schon von Nexus gesagt, std:vector.
-
Was denn nun: Primfaktorzerlegung oder Ermittelung aller Primzahlen in einem Interval?
-
josefh schrieb:
...
Folgendes dürfte deinem bisherigen Programm entsprechen (ungetestet - und ohne Bewertung des Inhaltes):
#include <algorithm> #include <cmath> #include <iterator> #include <vector> int main() { std::vector<int> primzahlen; primzahlen.reserve(100000); std::cout << "Die zu zerlegende Zahl: "; int maxZahl; std::cin >> maxZahl; std::cout << endl; /* Nun werden alle Primzahlen zwischen 2 und x ermittelt */ for(int i=2; i<=maxZahl; ++i) { bool istPrimzahl = true; for(int y=2; y<=sqrt((double)(i)) && istPrimzahl; ++y) if(i%y==0) istPrimzahl = false; if(istPrimzahl) primzahlen.push_back(i); } std::copy(primzahlen.begin(), primzahlen.end(), std::ostream_iterator<int>(std::cout, " ")); }
Einige Anmerkungen zu deinem Code:
1. Variablen sollte man immer erst deklarieren, wenn man sie auch verwendet, und auch nicht "recyceln".
2. Du kannst "using namespace std" zwar verwenden, solltest aber auch die Nachteile davon kennen (und bitte niemals im Header nutzen).
3. Für Wahrheitswerte nimmt man bool.
4. Schau dir wie schon gesagt die Containerklassen der C++ Standardbibliothek an.
5. return 0 wird implizit in der main-Funktion aufgerufen, daher unnötig.
6. Niemals mehr als eine Anweisung pro Zeile.
7. Möglichst auch nicht mehrere Variablendeklarationen in einer Zeile, zumal du da in einige Fallen bezüglich Initialisierung und Typen geraten kannst...
-
vielen dank @ all.
-
@asc: Du schreibst (wie ich finde) schönen lesbaren Code
Nur diese Zeile ist evtl. etwas irreführend bzw. (unnötigerweise?) aus dem C-Code übertragen:
asc schrieb:
primzahlen.reserve(100000);
Klar vermeidet es Kopien, blockiert aber auch Speicherplatz.
Für Neulinge könnte sie allerdings (evtl.) den Eindruck erwecken, dass eine solche Zeile/Kapazitätsanforderung notwendig sei.