2010-08-18 79 views
1

我在這裏做錯了什麼?如何返回指向結構數組內的元素的指針?

/* 
* Consider the following pseudo code ! 
*/ 
typedef struct foobar { 
    unsigned char id, count; 
    struct foobar *child; 
} foobar; 

foobar root = (foobar *) malloc(sizeof(struct foobar)); 
root->child = (foobar *) malloc(sizeof(struct foobar)); 

root->count++; 
root->child[0].id = 1; 

root->count++; 
root->child[1].id = 2; 

root->count++; 
root->child[3].id = 3; 

root->child[0].child = (foobar *) malloc(sizeof(struct foobar)); 

root->child[0].child[0].count++; 
root->child[0].child[0].id = 4; 

root->child[1].child = (foobar *) malloc(sizeof(struct foobar)); 
root->child[0].child[0].count++; 
root->child[1].child[0].id = 5; 

root->child[0].child[0].count++; 
root->child[1].child[1].id = 6; 

/* and so on */ 

/* 
* Function to search for an ID inside the tree, 
* it should call itself in order to go deeper into 
* the childs, but taht's not implemented here 
*/ 
foobar *search(unsigned char id, foobar *start_node = NULL); 
foobar *search(unsigned char id, foobar *start_node) { 
    if(start_node == NULL) { 
     unsigned char x; 
     for(x = 0; x < root->count; x++) { 
      if(root->child[ x ].id == id) { 
       foobar *ptr = &root->child[ x ]; 
       /* If I call ptr->id now, it will return the correct value */ 
       return &ptr; 
      } 
     } 

    } else { /* not implemented */ } 
} 

/* Search the array for and ID */ 
foobar **ptr = this->search(1); 
/* If I call ptr->id now, it will return memory garbage */ 

回答

1

我錯了..做了兩件事情中的行以上代碼:

foobar *ptr = &root->child[ x ]; 
return &ptr; 

應改爲簡單地return &root->child[ x ];,這將返回一個指向的root->child[ x ]的內存地址。

該行foobar **ptr = this->search(1);將變爲foobar *ptr = this->search(1);,這將允許使用. char來訪問結構屬性; ->不能使用,會輸出垃圾。正確的使用示例:(*ptr).description

非常感謝adamk

+0

你錯了 - '(* ptr).description'與* ptr->描述完全一樣。 – caf 2010-08-19 01:07:20

1

您正在返回您檢索到的指針的地址。你應該返回指針本身。

1

您只有一個孩子的malloc內存,但嘗試爲最多4個孩子設置ID。

它應該是這樣的:

root->child = (foobar *) malloc(sizeof(struct foobar) * 4); 
2

根有4個孩子(在您訪問根 - >子[3]),所以你必須分配足夠的內存:

root->child = (foobar *) malloc(sizeof(struct foobar) * 4); //at least 4 

而且,您應該返回foobar指針本身,而不是指向它的指針(即return ptr;而不是return &ptr;

+0

我糾正了代碼,現在我只返回「返回ptr」;內存仍然是垃圾。如何返回指向root-> child [x]的內存地址的有效指針,以便稍後在函數外使用它。 ideia將搜索id並返回包含該id的對象。 – Joao 2010-08-18 10:04:30

+0

您是否記得將'foobar ** ptr = this-> search(1);'改爲'foobar * ptr = this-> search(1);'也是? – adamk 2010-08-18 10:32:40

+0

是的..也做到了。我對C非常陌生,但是如果一個函數返回一個指向root-> child [x]的內存地址的指針(root是全局級別的var),則內存地址將在函數內部或外部有效。正確嗎? – Joao 2010-08-18 10:39:44

1

您正在從函數返回局部變量的地址(return &ptr;)。一旦search函數退出,該對象將被銷燬。試圖從函數外部使用這個內存位置會導致未定義的行爲。

+0

我糾正了代碼,現在我只返回「返回ptr」;內存仍然是垃圾。 如何返回指向root-> child [x]的內存地址的有效指針,以便稍後在函數外部使用它。 理念是做一個id的搜索並返回包含該id的對象。 – Joao 2010-08-18 10:04:10

相關問題