2011-02-15 362 views
0

如果這是一個非常簡單的問題,但我真的生鏽在C和谷歌搜索沒有幫助到目前爲止,我很抱歉。我有一個C函數,它在結構的數組和一個整數:如何獲得一個結構,在一個結構中,並將其分配給一個結構數組

int foo(struct record *records, int n) 
{ 

} 

並且還鏈接列表,其中每個節點具有結構:

struct rnode 
{ 
    struct record rec; 
    struct rnode *next; 
} 

和struct記錄是:

struct record 
{ 
    enum recordtype type; 
    union recordvalue 
    { 
     int intval; 
     char strval[19]; 
    } value; 
}; 

foo(結構記錄,int)我遍歷鏈表並將第一個「n」結構記錄分配到數組中,如:

int foo(struct record *records, int n) 
{ 
    int count = 0; 
    struct rnode *cur = recordlist; 
    while(cur != NULL) 
    { 
     records[count] = cur->rec; //Basically, how do I write this line? 
     printf("%d\n", records[count].type); //Both these print the correct values 
     printf("%d\n", records[count].value.intval); //Prints correct values 
     count++; 
    } 
} 

我試圖做: 記錄第[count] = CUR-> REC

其中編譯但是當我執行以下操作:

struct record *records = malloc(sizeof(struct record)*n); 
foo(records, n); //This should populate the array records but it isn't. 
//If I print record[0].value.intval here I get 0. 

但是當我通過&記錄[0]到另一個功能,如:

checkrecord(&record[0]); 

其中聲明checkrecord:

checkrecord(const struct record *r) 

裏面的函數,r-> type和r-> value.intval都返回0而不是正確的值。

我很確定我正確地將結構記錄存儲到數組中,但我不知道我在做什麼錯了。

我並不是說固執,但問題是checkrecord()函數我沒有在改變的自由,但我可以改變我的參數傳遞給它。

+1

`records [count] = cur-> rec`是對的,但是我沒有通過檢查`&record [1]來得到你想要的結果。你會想要在結構內部的東西,記錄[1] .some_member – nos 2011-02-15 09:14:17

+0

@nos是現貨......`&記錄[1]`只是要求一個指向第一條記錄的指針......它永遠不可能是「結構的*值*」 – 2011-02-15 09:18:57

回答

0

感謝您的幫助大家。這實際上是其他地方的記憶問題。上面的代碼是正確的。

0
*(cur->rec) 

根據您發佈的樣本,這應該不起作用。

複製的記錄結構的正確方法是:

records[count] = cur->rec; 

如果你想有一個指針鏈表的實際結構,你需要有一個指針數組來記錄,而非目前的記錄數組。在這種情況下,你分配:

records[count] = &(cur->rec); 
0

記錄[計] = CUR-> REC是正確的,但是你錯過CUR = CUR->未來。記錄[1]是第二條記錄,而&記錄[1]是它的地址。

相關問題