malloc geht nicht!!!



  • sizeof ist ein Compile-time-operator. Dies heißt, dass die Größe die du ermittlen willst constant und bereits beim Compiliren bekannt sein muss. (dies ist bei malloc nicht der Fall!)



  • jetzt würde mich interessieren, obs ne methode gibt die bei dyn. erzeugten objekten deren grösse ermitteln kann oder geht dies nur mit zur hilfenahme meines debuggers.



  • grenouille_unreg schrieb:

    jetzt würde mich interessieren, obs ne methode gibt die bei dyn. erzeugten objekten deren grösse ermitteln kann oder geht dies nur mit zur hilfenahme meines debuggers.

    Eine Klasse schreiben die sich die größe merkt?
    Oder einfach die größe in einer Variablen speichern?



  • Die Antwort lautet std::vector. 🤡



  • und warum funktioniert mein code dann nicht??

    short int* buffer = NULL;
    t = 1000,

    buffer = (short int*)malloc(sizeof(short int) * t);

    Der buffer sollte nun 2000 bytes groß sein, ist er aber nicht sondern 4 😕

    waaaarum ist das so??



  • loooooool, das wurde hier doch schon erklärt.

    der aufruf hat (höchstwahrscheinlich) geklapt. aber der zeiger auf den datenbereich ist nunmal 4 bytes groß.



  • l00P schrieb:

    Der buffer sollte nun 2000 bytes groß sein, ist er aber nicht sondern 4 😕

    waaaarum ist das so??

    Weil du n icht lesen kannst.

    Lies mein Posting und danach Bashars Posting

    Wenn dann etwas unklar ist, dann frag!



  • kann euch leider nicht folgen...

    erstens verwende ich jetzt short int und das sind 2 bytes soviel ich weiß.

    zweitens kann ich mir nicht vorstellen das das stimmt was ihr sagt, ich sehe es im debugger (VC 6). Der liest einfach nur 4 bytes. das ist so....

    wenn ich falsch leige, dann schreib mir bitte mal deine variante auf wie du aus einem binären file 2000 bytes in diesen buffer bekommst...

    lg



  • ein zeiger ist auf einer architektur immer gleich groß. egal worauf er zeigt.



  • hast du die datei auch binär geöffnet? "rb"?



  • nein die datei ist mit
    file1.Open(filename, CFile::modeRead);

    geöffnet, macht das was aus??
    In der datei stehen ascii und hex daten drinnen (daten sind hex, header ist ascii)



  • CFile::modeRead | CFile::typeBinary

    versuch es so.



  • geht auch nicht, das Problem ist nicht das lesen oder schreiben sondern das der buffer nur 4 bytes groß ist ... 😕



  • quatsch. ist er nicht.



  • wenn ich den buffer mit short int buffer[1000] initialisiere gehts. Dann zeigt mir der debugger auch sizeof(buffer) = 2000 an.

    short int* buffer = (short int*)malloc(sizeof(short int) * 1000) funktioniert nicht.

    Warum also. Mag schon sein das der buffer wirklich 2000 hat aber warum gehts dann nicht???? Wenn mir das mal einer sagen könnte ....



  • l00P schrieb:

    wenn ich den buffer mit short int buffer[1000] initialisiere gehts. Dann zeigt mir der debugger auch sizeof(buffer) = 2000 an.

    short int* buffer = (short int*)malloc(sizeof(short int) * 1000) funktioniert nicht.

    Warum also. Mag schon sein das der buffer wirklich 2000 hat aber warum gehts dann nicht???? Wenn mir das mal einer sagen könnte ....

    Weil sizeof ein operator ist, der zur Compilezeit ausgewertet wird. Ein int* hat immer eine konstante Größe um eine Zahl/eine Speicheradresse aufnehmen zu können, die auf einen allokierten Speicherbereich verweist. Ein int[]-Feld hat aber eine konstante Größe, die schon zur Kompilation bekannt ist und damit auch ausgegeben werden kann.

    Gruß Tobias



  • Danke Tobias!

    das glaube ich schon aber mir ist nicht klar warum es nicht geht!!!! Der scheiß buffer sollte 2000 haben, wenn er es hat, warum liest er dann nur einen bruchteil meiner daten ein????



  • l00P schrieb:

    Danke Tobias!

    das glaube ich schon aber mir ist nicht klar warum es nicht geht!!!! Der scheiß buffer sollte 2000 haben, wenn er es hat, warum liest er dann nur einen bruchteil meiner daten ein????

    Weil du ihn oben immer mit 1000 anlegst. Schreibst du eigentlich C oder C++? malloc macht man in C, in C++ sollte man new schreiben, damit man nicht casten muss. In C sollte man nicht casten sondern

    short int* buffer = malloc(sizeof *buffer * 1000);
    

    schreiben.


Anmelden zum Antworten