2014-09-21 43 views
1

予有這種類型的定義:如何動態分配'typedef struct'元素的數組?

typedef struct element 
{ 
    uint16_t value_raw; 
    float value_scaled; 
    char *tag; 
    char *id; 
    float scale; 
} element; 

我需要全局聲明這些類型的數組,一個文件,如在同一文件中的幾個其他功能需要訪問它。但是在讀取配置文件之前,我不會知道數組的大小,所以我需要動態分配它。我已經試過這樣:

element *pv; 

int main() 
{ 
    int i; 
    int size = findoutthesize(); 
    pv = malloc(sizeof(element) * size); 

    /* and then access the elements like this */ 
    for (i = 0; i < size; i++) 
     pv[i].scale = (float) i; 
} 

,但它並沒有完全制定出我所料的道路...(所有.scale成員最終被同樣的價值,這是大小-1)

什麼是動態分配'元素'類型的數組的正確方法,所以我可以訪問數組中的每個元素的成員?

+0

您的代碼是正確的,並且'scale'已正確初始化(例如,參見http://ideone.com/0MpJR8)。你如何檢查'scale'的值? – manlio 2014-09-21 20:04:22

+0

它實際上是我不想在這裏發佈的較大文件的一部分,以防我嚇壞了任何人,但我可能已經模糊了真正的問題...... https://github.com/eriknyquist/modbus/ blob/master/abb_pch550_modbus.c 你可以看到我試圖在293行上做同樣的事情 – 2014-09-21 20:13:44

回答

0

爲了保證有199線和200個問題:

e.tag = tag; 
e.id = idbuf; 

char tag[80]char idbuf[80]是局部變量和因此e.tag/e.id指針纔有效,直到get_element函數結束。

這裏:

for (i = 0; i < modbus_read_count; i++) 
{ 
    pv[i] = get_element(fp, line); 
    printf("tag=%s, id=%s, scale=%.1f\n", pv[i].tag, pv[i].id, pv[i].scale); 
} 

pv[i].tagpv[i].iddangling pointers

你可以你element結構更改爲類似:

typedef struct element 
{ 
    uint16_t value_raw; 
    float value_scaled; 
    char tag[80]; 
    char id[80]; 
    float scale; 
} element; 

,並在get_element函數內部,對e.tag/e.id直接工作。