2016-03-22 3 views
-2

У меня есть следующий код.casting void * to 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; 

} 

код хорошо подходит для sa, но не для sb !!! Функция f() делает то же самое три строки кода после «Struct_A * sa;» делает. Любая идея, что не так с функцией f()?

+1

Это не C, но C++! В C вы не должны использовать 'void *' для другого типа указателя – Olaf

+0

@Olaf Другой способ не C++, но C –

+0

@ DieterLücking: 'cout << sb-> a << endl' или' new byte [1000]; 'are C? – Olaf

ответ

0

Вы па С.Б., но вы должны передать указатель на С.Б. и объявить п иметь дополнительный косвенность:

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

Поскольку это C++, просто используйте ссылку: 'void f (Struct_A & sa, ...)' Или еще лучше, просто * верните * указатель: 'Struct_A * f (...)' –

+0

@Andrew Henle, может быть отлично подходит для C++, но я ответил на C. Должен ли работать и на C++, не так ли? (Я ненавижу эти ремарки, поскольку вы забываете, что это на самом деле указатель ...) –

+0

Кто-то отредактировал вопрос об удалении C++ и заменил его на C. Не знаю, почему, как 'new',' #include 'и' namespace' все ясно C++, а не C. –