2013-09-24 25 views
1

我有以下結構創建:複製到C結構的指針數據庫

typedef struct { 
    char name[15]; 
    int ID; 
} Employee; 

typedef Employee Item; 

typedef struct { 
    Item items[5]; 
    int size; 
} List; 

我使用這個函數調用作爲偷看,看看有什麼被存儲在列表中:

void Peek (int position, List *L, Item *X); 

該函數應該將列表[L]中的項目放在[position]並將其地址複製到[X]。我對防窺視功能如下:

void Peek (int position, List *L, Item *X) { 
    Item *B; 
    B = malloc(sizeof(L->items[position])); 
    X = B; 
} 

這就賦予X相同的位置爲B,但是我認爲這會導致內存泄漏,更重要的是,如果我嘗試調用項X的ID回到我的主,從這個函數:

int EmployeeID (Employee X) { 
    return(X.ID); 
} 

我與32665或類似的規定退還。將數據從L轉換爲X的另一種方法是什麼?

+1

請啓用所有警告和調試的信息你編譯器(例如Linux上的'gcc -Wall -g');並學習如何使用調試器(例如'gdb')。 –

+0

調試器能讓我判斷它是否是邏輯問題嗎? – user2225940

+0

是的,你需要掌握如何使用調試器。 –

回答

1

X和B都是指針

X = B是指針分配,而不是結構分配

X是傳值參數,在函數內部將值分配給X具有對零值的影響X以外的功能。

試試這個(不是一個解決辦法,但在正確方向邁出的一步):

void Peek (int position, List *L, Item **X) 
{ 
    Item *B; 
    B = malloc(sizeof(L->items[position])); 
    *X = B; 
} 

然而,L->項[位置]的值仍然沒有分配到X空間。

選項2:

void Peek(int position, List *L, Item *X) 
{ 
    *X = L->items[position]; 
} 

這假定X已經指向的內存malloc分配塊。如果不是這樣,選擇3

方案3:

void Peek (int position, List *L, Item **X) 
{ 
    Item *B; 
    B = malloc(sizeof(L->items[position])); 
    *X = B; 
    *B = L->items[position]; 
} 
1

「功能應該......它的地址複製到X〜>的問題與此代碼:

void Peek (int position, List *L, Item *X) { 
    Item *B = malloc(sizeof(L->items[position])); 
    X = B; 
} 

是它不會更改作爲第三個參數傳遞的原始指針。你真正需要做的是修改指針本身,因此你需要無論是從功能即指針返回這個指針或把它作爲Item**,以指針:

void Peek (int position, List *L, Item **X) { 
    Item *B = malloc(sizeof(L->items[position])); 
    *X = B; 
} 
... 
// and somewhere: 
Peek(position, L, &X);    // <-- you should pass an address of pointer