2017-05-05 55 views
-2

我有這樣的結構:傳遞字符數組常量無效* 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)); 

我遇到的問題是如果我在調用函數之前打印first->data的值N,它包含了預期,但如果我調用該函數:

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

,並嘗試打印裏面PRW,它包含什麼。

我想我傳遞的值不正確,因爲它被聲明爲char數組,但函數參數是一個const void *。 P.S.我不想改變賦值參數類型。

其中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編譯器有一個非標準的語言擴展允許這個(作爲20世紀90年代修復舊的"struct hack")。這一切都在1999年用C99標準過時,當靈活陣列成員被添加到該語言。

你的結構改成這樣:

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

然後分配內存作爲

PARAM* p = malloc(sizeof(PARAM) + sizeof(n)); 

其中n是要在陣列char val[]有長度。


因爲你的函數的格式const void* prw,在通話的最後一個參數應該是first->val,而不是&first->val

這是一個很好的例子,爲什麼應儘可能地避免void指針:它們傾向於隱藏錯誤並阻止編譯器警告。