malloc



  • Moin moin!
    ich bin etwas unsicher was malloc betrifft.
    Hier ein kleines Bsp.

    FILE *source;
    char source_tmp;
    char *buffer;
    int i=0,j=0;
    /*File öffnen zum lesen*/
    
    buffer = (char*)malloc(sizeof(2));
    
    /*Überpruefung auf buffer == NULL*/
    
    while((source_tmp=fgetc(source)) != EOF)
    {
         buffer[i] = source_tmp;
         i++;
    }
    
    for(j=0; j < X; j++)  /*X stellt die größe des Files dar zb.80*/
    {
        printf("%c", buffer[j]);
    }
    

    Mein Problem ist, dass die gesamte Textdatei ausgegeben werden kann, wobei aber malloc(sizeof(2)); geschrieben worden ist!
    Weiss vielleicht jemand warum ?



  • Du musst die Überprüfung machen, wie viele Zeichen du einliest.

    Was soll überhaupt sizeof(2) ergeben?
    sizeof() gibt dir den Speicherbedarf von Variablen an.

    Und der Typcast beim malloc (das (char*)) ist in C nicht nötig.



  • Nur weil du nicht die betreffende größe reservierst kannst du trotzdem in den Speicher schreiben. Dann aber mit undefiniertem Verhalten (d.h. kannn funktionieren muss aber nich). Normalerweise würde VS bei mir beim Debugging sagen das mein Heap corrupted ist. Wies bei deinem Compi is weiß ich nicht.



  • @DrikB sizeof(2) dient nur als test, ich kann natürlich auch int
    reinschreiben, kommt auf für mich aufs gleiche für meinen Test.
    @Jonas laut meinen prof. ist unser Debugger aufs härteste eingestellt xD.
    Anscheinend doch nicht haha. Dann lass ich das mal so



  • Alleine das

    for(j=0; j < X; j++)  /*X stellt die größe des Files dar zb.80*/
    {
        printf("%c", buffer[j]);
    }
    

    haut schon nicht hin, wenn X > sizeof(2) ist. Was immer auch sizeof(2) ist.



  • @Dave01: Wenn dann schreib einfach 2.
    Und zum Thema aufs härteste eingestellt: Das hängt vom Debuger und Compiler ab und davon wie gut die sich gegenseitig kennen (Debuginfos). In Visual-Studio kennen sie sich natürlich. Und die Überprüfung ist wahrscheinlich zusätzlicher Code in der Debug-Version.


Anmelden zum Antworten