如何返回指向结构数组内元素的指针?

时间:2010-08-18 09:22:58

标签: c arrays pointers struct

我在这里做错了什么?

/*
 * 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 */

5 个答案:

答案 0 :(得分:2)

root有4个孩子(当你访问root-&gt; child [3]时),所以你必须分配足够的内存:

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

此外,您应该返回foobar指针本身,而不是指向它的指针(即return ptr;而不是return &ptr;

答案 1 :(得分:1)

您将返回您检索到的指针的地址。你应该返回指针本身。

答案 2 :(得分:1)

您只为一个孩子使用malloc内存,但尝试为最多4个孩子设置ID。

应该是这样的:

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

答案 3 :(得分:1)

您正在从函数searchreturn &ptr;)返回局部变量的地址。退出search函数后,此对象将被销毁。尝试从函数外部使用此内存位置将导致未定义的行为。

答案 4 :(得分: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访问struct属性;无法使用->并输出垃圾。正确的用法示例:(*ptr).description

非常感谢adamk