2016-03-22 11 views
-2

私は以下のコードを持っています。C++でvoid *を構造体にキャストする

#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;"の後の3つのコード行とまったく同じことを行います。そうです。関数f()の何が問題なのか?

+1

これはCではありませんが、C++! Cでは 'void *'を別のポインタ型にキャストすべきではありません。 – Olaf

+0

@Olaf他の方法はC++ではありませんが、C –

+0

@DieterLücking: 'cout << sb-><< endl'または' new byte [1000];はCですか? – Olaf

答えて

0

あなたのPAS SBは、しかし、あなたは余分な間接を持っているSBとFを宣言するためにポインタを渡す必要があります。

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です。 –

関連する問題