2017-05-05 13 views
-2

に文字列を渡す私はこのような構造を持っている:のconstのvoid *のPARAM

typedef struct { 
    float batch; 
    float length; 
    uint32_t test; 
    char val[0]; 
} 
PARAM; 

をそして、この形式で関数を呼び出しています:

void fillValues(float val, float len, uint32_t tmp, const void* prw); 

私は構造体を宣言し、いくつかのメモリを割り当てます:

PARAM *first = calloc(10, sizeof(PARAM)); 

functioを呼び出す前にfirst->dataの値を印刷すると問題が発生します。 nは予想通り、それは含まれていますが、私は関数を呼び出す場合:

fillValues (test, first->batch, first->length, first->test, &first->val);

と試してみて、内部のプリントPRWを、それは何が含まれていません。

私はchar配列として宣言されているため、関数のパラメータがconst void *であるため、値を間違って渡していると思います。 P.P. fucntionのparam型を変更したくありません。 PRWをfillValuesに使用される部分のみ

は二重に変換される:

double *value 
value = (double*)first->data; 
*value = *(const double*)pwr; 
+0

申し訳ありませんいくつかの愚かなタイプミス私の間違い – homeGrown

+1

@homeGrownだからここでコードをコピー/貼り付け、それを再入力しないでください。 –

+0

@Michael Walz巨大な関数なので無駄なコードを追加したくない – homeGrown

答えて

3

char val[0];は無意味であり、これはC.アレイはサイズがゼロを持つことができない有効ではありません。 GCCコンパイラはこれを可能にする非標準的な言語拡張を持っていました(1990年代の古い"struct hack"の修正版)。これは、1999年には、フレキシブルな配列メンバーが言語に追加されたC99標準で、時代遅れになりました。

これにあなたの構造体を変更し

typedef struct { 
    float batch; 
    float length; 
    uint32_t test; 
    char val []; // flexible array member 
} 
PARAM; 

その後

nあなたは、配列 char val[]を持つようにしたい長さである
PARAM* p = malloc(sizeof(PARAM) + sizeof(n)); 

としてメモリを割り当てます。


関数がフォーマットconst void* prwを持っているので、呼び出しの最後のパラメータはfirst->valなく&first->valでなければなりません。

これは、可能であればボイドポインタを避けるべき理由の完全な例です。バグを隠し、コンパイラの警告をブロックする傾向があります。

関連する問題