Komischer(?) Parameter in C-Funktion...
-
Hallo zusammen, jetzt hab ich mal ein ganz dumme Frage (mhr oder weniger). Jeder kennt die Funktion fwrite(...). Nun hab ich mir die Funktionsprototypen mal aus interesse angeschaut, da mich interessiert hat wie fwrite mit einen void* buffer unbestimmter größe umgeht. Denn irgendwo muß er es ja herwissen, sonst könnte er ja den buffer nicht schreiben. Nunja, mal der Funktionskopf:
_CRTIMP __checkReturn_opt size_t __cdecl fwrite(__in_ecount(_Size*_Count) const void * _Str, __in size_t _Size, __in size_t _Count, __inout FILE * _File);Und meine Frage dazu: Wieso darf?/ wird vor const void *_Str noch eine Funktion aufgerufen [__in_ecount(_Size*_Count)]? Das ist doch eigentlich nicht zulässig, oder?
Und wie kann man selbst die größe des/eines void *buffers herausbekommen?Danke für eure Antworten bzw Hilfe =))
-
__in_ecount ist ein Makro, keine Funktion

Und die Größenangaben des Buffers musst du ja beim Aufruf als Parameter übergeben, die findet fwrite nicht selbst raus.
-
Aber wieso kann ich zB eien string von 25 zeichen übergeben und trotzdem 256 Byte als count übergeben ohne das was passiert?
-
Wenn nichts passiert, wäre das reiner Zufall. Sowas nennt man undefiniertes Verhalten, es kann also _alles_ passieren. Daher solltest du schon selbst darauf achten, korrekte Argumente zu übergeben, weil ein Programm mit undefiniertem Verhalten ein kaputtes Programm ist.
Da ich deinen konkreten Fall nicht kenne, kann es aber auch sein, dass dein String zwar nur 25 Zeichen lang ist, dieser sich aber in einem definierten Bereich von 256 möglichen Zeichen befindet. Das wäre dann ok, auch wenn der Müll hinter dem String ebenfalls in der Datei landen würde. Hier ist dann eher ein logischer Fehler zu beheben.
-
ja, der string buffer ist zb 256 groß und als count übergeb ich auch 256, das wäre auch soweit ok, trotzdem landen am ende dann zb bloß 25 zeichen in der datei wenn nur 25 zeichen im string stehen. vlt fragt er ja intern nach dem \0 nach? bei int-buffern stell ich mir schon vor das man es genau angeben muß.
-
fwrite sollte schon alles schreiben. Hast du mal geprüft, ob beim Schreiben ein Fehler aufgetreten ist? ferror sollte dabei helfen.
-
Stimmt, habs gestern probiet und er schreibt tatsächlich den ganzen Buffer. So kann man sich täuschen... Fehler gibts keine ^^