2016-09-28 7 views
1

私は事前に十分なスペースを確保しなければなりません。私は、より大きなタイプの4kのために十分なスペースを割り当てて、それを実際にどのような種類のデータで埋めるかを決定すると思いました。私はコンパイラが私にエラー(etoa:1554):不正なタイプ(ptr-to-void '+' int)と言う問題にぶつかっています。Cでグローバルストレージエリアタイプを独立に保つ方法は?

ser_dat_ch = calloc(LABEL_T_CNT, 
     (sizeof(mpls_vpws_t) > sizeof(mpls_vpls_t) 
     ? sizeof(mpls_vpws_t) 
     : sizeof(mpls_vpls_t))); 

ser_dat_chがそうのようなファイルスコープで宣言されています:私のinit関数で

は、私はこのようなスペースに何かを割り当てる
static void *ser_dat_ch = NULL; 

私は構造にデータをロード

、I

rv = switch_mpls_vpws_data_get(lab, (mpls_vpws_t*)&ser_dat_ch[lab]); 

のようにしたかったのですが、これがcompi私を吠えている。どうしたの?

+2

「動的割り当ては許可されていません」と「calloc()」はどのようにメッシュされますか? – EOF

+0

私は 'call()'を非常に最初の部分(私の 'init()'関数内)で使用します - これは許可されています! – cerr

+0

@cerrですが、 'calloc()'は動的割り当てを行います。そのため、「動的な割り当ては許可されていません」という意味は不明です。 –

答えて

6

この場合、最も簡単な解決策は、ユニオンタイプの4Kエントリを持つバッファを作成することだと思います。

struct A {/**/}; 
struct B {/**/}; 

union AB { 
    struct A a; 
    struct B b; 
}; 

union AB ser_dat_ch[4000]; 
+0

私は組合について完全に忘れました!ありがとう! – cerr

+1

大きなアプローチですが、メモリレイアウトが(コンパクトではなく)異なるため、キャッシュの効率が低下する可能性があることに注意してください。通常は問題ではありません。高性能アプリケーションでは注意が必要です。 – Thomas

+0

しかし、すべての単一エントリがより大きなタイプのものであるときに、それは最悪の場合でもコンパクトです。 – hugomg

3

要素型のサイズが不明なため、voidポインタをインデックスできません。だから、最初の特定のタイプにポインタをダウンキャスト、そしてだけにしてインデックス作成を行います。

rv = switch_mpls_vpws_data_get(lab, &((mpls_vpws_t*)ser_dat_ch)[lab]); 

コンパイラは+オペレータ文句理由はser_dat_ch[lab]*(ser_dat_ch + lab)と同等であるということです。

関連する問題