memcpy, unknown size



  • hier erstmal der Codeteil:

    int WINAPI SendReplaced(SOCKET s, const char* buf, int len, int flags)
    {
    	void *p_str = (void*) malloc (len * 2);
    	int temp = 0, p = 0;
    
    	for(int i=0; i <= len; i++) {
    
    		memcpy(&temp, (buf + i), 1);
    		p = temp + 13776;
    		memcpy(p_str + (i + 1), &p, 2);
    		memset(p_str + (i * 2) + 1, 0x00, 1);
    		memset(&temp, 0x00, sizeof(int));
    	}
    
    	MessageBox(0,(const char*)p_str,0,0);
    
        return len;
    }
    

    Ich benutze VS6.0, bei den beiden memxxx Funktionen kriege ich die folgenden Fehle:

    C:\Projects\wsh\dfg.cpp(21) : error C2036: 'void *' : unknown size
    C:\Projects\wsh\dfg.cpp(22) : error C2036: 'void *' : unknown size
    C:\Projects\wsh\dfg.cpp(22) : error C2036: 'void *' : unknown size

    Ist das ein Standard Problem beim compiler? Eigentlich dürfte das doch z. B. hier nicht sein:
    memcpy(p_str + (i + 1), &p, 2);

    p_str - wurde oben deklariert und zeigt an den Anfang eines reservierten Speicherbereich.
    i - Counter in der Schleife

    Hat jemand vielleicht eine Lösung parat? 🙂



  • ja; void hat keine größe, deswegen kann man auf void * auch nichs drauf zählen.

    char *p_str = (char*) malloc (len * 2);
    

    wird funzen.



  • Nicht casten den malloc bei C (nur bei C++)!
    So:

    void *p_str = malloc (len * 2);
    


  • ok danke, hat funktioniert! 😉

    hm, wie es scheint muss man den malloc doch casten:

    C:\Projects\dfghdgf\dfghdgf.cpp(14) : error C2440: 'initializing' : cannot convert from 'int' to 'char *'

    vielleicht ist das vom compiler abhängig, der eine will und der andere nicht 🙂



  • nein, in C musst du nicht casten in c++ schon. Die meisten IDEs kompilieren die .c Dateien mit dem C kompiler, die C++ Datein mit dem C++ compiler; malloc wird in der Datei dfghdgf.cpp, also greift da der C++ Compiler zu! Wenn ihr C++ benutzt, dann nutzt auch new und delete und nicht malloc/free. Die Mischung aus C und C++ ist nicht gut und führt genau zu diesen Problemen.

    esskar schrieb:

    void hat keine größe,

    wirklich? Soweit ich mich erinnern kann, muss nach ANSI C sizeof(void)=sizeof(char) gelten oder sizeof(void)=1, da bin ich aber nicht so sicher, hab seit langem nicht mehr im Standard nachgeschaut.



  • Nein, zu dem Problem was er hat, führt genau das was diesen Cast zu einem Problem macht 🙂

    Für die die es nicht wissen. In alten C Standards und Versionen (seit C99 nicht mehr), gibt es implizit-int. Das bedeutet, dass der Compiler int als Default-Typ da benutzt, wo kein Typ angegeben ist. Wenn man nun stdlib.h nicht inkludiert, wo malloc richtig deklariert ist, nimmt der Compiler die Form int malloc(); an.

    Wenn nun sizeof(int) ungleich sizeof(void*) ist, dann kann es sein, dass da bytes abgeschnitten werden oder hinzukommen, so dass man am Ende irgend welche Adressen erhält. Wenn man kein Cast hat, dann meldet der Compiler eben einen Fehler, ansonsten übersieht man das Problem.

    Hoffe, dass ist verständlich.

    Also kein Cast nach malloc und stdlib.h immer inkludieren, wenn man malloc nutzt.

    man: malloc(3)



  • sizeof(void)==1? nicht das ich wüsste.



  • naja,
    ich denke void * auf void * zu casten ins schon unnötig.
    trotzdem wird ein Addition auf einen void * pointer nicht funzen, da eben void keine größe hat



  • Lazy schrieb:

    memset(&temp, 0x00, sizeof(int));
    

    Interessant, reicht denn ein einfaches

    temp = 0;
    

    nicht aus?


Anmelden zum Antworten