Notenprogramm - Probleme mit malloc / free

  • geschlossen
  • C

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Notenprogramm - Probleme mit malloc / free

    Hi Leuts

    Ich habe Aufgabe, ein Noten-Konsolenprogramm zu schreiben. Dabei soll die Anzahl Schüler sowie die Anzahl Fächer angegeben werden können, danach wird für jeden Schüler bei jedem Fach die Note eingegeben. Ausgegeben werden sollen jegliche Noten sowie den Schnitt der jeweiligen Schüler. Weiter habe ich die Vorgabe, dass der Speicher dynamisch abhängig von der Anzahl Schüler und der Anzahl Fächer angelegt werden soll.

    Ich habe das Ganze so realisiert:

    Brainfuck-Quellcode

    1. /****************************************************************************************/
    2. void main()
    3. /****************************************************************************************/
    4. //
    5. // Zweck:
    6. // Main-Funktion
    7. //
    8. //----------------------------------------------------------------------------------------
    9. {
    10. int anz_schueler = 0;
    11. int anz_faecher = 0;
    12. float klassenschnitt = 0;
    13. float notenschnitt = 0;
    14. float** noten;
    15. printf ("Bitte geben Sie die Anzahl Sch%cler ein: ", 129);
    16. scanf_s ("%d", &anz_schueler);
    17. printf ("Bitte geben Sie die Anzahl F%ccher ein: ", 132);
    18. scanf_s ("%d", &anz_faecher);
    19. printf ("\n");
    20. noten = (float**) malloc (anz_schueler * sizeof(float*));
    21. if (noten == NULL) {
    22. printf ("Nicht gen%cgend Speicherplatz!", 129);
    23. return;
    24. }
    25. for (int counter = 0; counter < anz_schueler; counter++) {
    26. noten[counter] = (float*) malloc (anz_faecher + 1 * sizeof(float));
    27. if (noten[counter] == NULL) {
    28. printf ("Nicht gen%cgend Speicherplatz!", 129);
    29. return;
    30. }
    31. }
    32. for (int counter = 0; counter < anz_schueler; counter++) {
    33. printf ("Sch%cler %d:\n", 129, counter + 1);
    34. for (int counter2 = 0; counter2 < anz_faecher; counter2++) {
    35. printf ("\tFach %d: ", counter2 + 1);
    36. scanf_s ("%g", ¬en[counter][counter2]);
    37. notenschnitt += noten[counter][counter2];
    38. }
    39. noten[counter][anz_faecher] = notenschnitt / anz_faecher;
    40. notenschnitt = 0;
    41. printf ("\n");
    42. }
    43. system ("cls");
    44. for (int counter = 0; counter < anz_schueler; counter++) {
    45. printf ("Sch%cler %d:\n", 129, counter + 1);
    46. for (int counter2 = 0; counter2 < anz_faecher; counter2++) {
    47. printf ("\tFach %d: %g\n", counter2 + 1, noten[counter][counter2]);
    48. }
    49. printf ("\tSchnitt: %g\n", noten[counter][anz_schueler]);
    50. printf ("\n");
    51. }
    52. for (int counter = 0; counter < anz_schueler; counter++) {
    53. free(noten[counter]);
    54. }
    55. free(noten);
    56. system ("pause");
    57. } // void main(...)
    Alles anzeigen

    Ich hoffe, das ist einigermassen leserlich ...


    Das Programm erfüllt absolut seinen Zweck, alles funktioniert ordnungsgemäss, bis auf die Funktion "free" am Ende. Dabei wird der zuvor durch "malloc" entsprechend angelegte Speicher im System wieder freigegeben, jedoch spuckt mir da VisualStudio bzw. Windows eine Fehlermeldung aus:

    Quellcode

    1. HEAP CORRUPTION DETECTED: after Normal block (#50) at 0x00352760.
    2. CRT detected that the application wrote to memory after end of heap buffer.


    So wie ich das interpretiere heisst das, ich schreibe über den reservierten Speicher hinaus, was natürlich nicht zugelassen ist. Jedoch komm ich einfach nicht drauf, wieso da drüber hinaus geschrieben wird.


    Vielleicht noch zur Info: Ich probier mich jetzt seit etwa 6 Wochen in C, deshalb seid bitte ein bisschen nachsichtig mit mir ;). Falls ihr noch Infos braucht, bitte fragen.

    Grosses :thx:!

    Greets musicjunkie
  • Problem gelöst!

    Es lag an der Zeile:

    Quellcode

    1. noten[counter] = (float*) malloc (anz_faecher + 1 * sizeof(float));


    diese sollte natürlich

    Quellcode

    1. noten[counter] = (float*) malloc ((anz_faecher + 1) * sizeof(float));


    heissen!


    Greets musicjunkie


    HIER KANN DANN GECLOSED WERDEN!