2016-03-22 11 views
-2

Ich habe den folgenden Code.casting void * zu struct * in C++

#include <iostream> 
using namespace std; 
typedef unsigned char byte; 

typedef struct { 
    unsigned int a; 
    unsigned int b; 
} Struct_A; 

void* malloc_(size_t s, byte* heap, int *next) { 
    int old = *next; 
    *next = *next + s; 
    return heap + old; 
} 

void f(Struct_A *sa, byte* heap, int *next) { 
    sa = (Struct_A*) malloc_(8, heap, next); 
    sa->a = 10; 
    sa->b = 20; 
} 

int main() { 
    byte *heap = new byte[1000]; 
    int next; 
    next = 0; 

    Struct_A *sa; 
    sa = (Struct_A*) malloc_(8, heap, &next); 
    sa->a = 100; 
    sa->b = 200; 

    cout << sa->a << endl; 


    Struct_A *sb; 
    f(sb, heap, &next); 
    cout<< sb->a <<endl; 


    return 0; 

} 

der code funktioniert gut für sa aber nicht für sb !!! Funktion f() tut genau das gleiche, was die drei Codezeilen nach "Struct_A * sa;" tut. Irgendeine Idee, was mit der Funktion f() falsch ist?

+1

Dies ist nicht C, aber C++! In C sollte man 'void *' nicht in einen anderen Zeigertyp umwandeln – Olaf

+0

@Olaf Andersherum nicht C++ aber C –

+0

@ DieterLücking: 'cout << sb-> ein << endl' oder' neues Byte [1000]; 'sind C? – Olaf

Antwort

0

Sie pas sb, aber man sollte einen Zeiger auf sb und erklären f passieren eine zusätzliche Indirektion haben:

void f(Struct_A **sa, byte* heap, int *next) { 
    *sa = (Struct_A*) malloc_(8, heap, next); 
    (*sa)->a = 10; 
    (*sa)->b = 20; 
} 

int main() { 

    Struct_A *sb; 
    f(&sb, heap, &next); 
+0

Da es C++ ist, benutze einfach eine Referenz: 'void f (Struct_A & sa, ...)' Oder noch besser, * gib * den Zeiger zurück: 'Struct_A * f (...)' –

+0

@Andrew Henle, könnte sein gut für C++, aber ich antwortete in C. Sollte auch in C++ arbeiten, nicht wahr? (Ich hasse diese Rerferenzen, wie Sie vergessen, ist aucually ein Zeiger ...) –

+0

Jemand redigierte die Frage, um C++ zu entfernen und es mit C. zu ersetzen. Keine Idee warum, wie 'new',' #include ', und' namespace' sind alle eindeutig C++ und nicht C. –