从函数返回指向链表的节点的指针

时间:2016-02-11 14:24:50

标签: c pointers return-value

我尝试将指针从函数传递给链表节点 这里是伪代码(I' m使用C):

node_t *node = % first node initialization % ; //global

int func(int valueToFind, node_t *parentNode) {
    while(node = node->next()) {
        if(node->value == valueToFind) {
            parentNode = node->prev();
            return 1;
        }
    }
    return 0;
}

int main() {
    node_t *parent;
    EDIT:
       parent = malloc(sizeof(node_t));
    END EDIT
    if(1==func(16, parent)) {//searching for value 16
        printf("%d\n", parent->value);
    }
}

在程序崩溃的printf("%d\n", parent->value);行 我究竟做错了什么?

3 个答案:

答案 0 :(得分:2)

parentNode的参数func()按值传递,这意味着即使您在函数内部更改了它的值,它也与main()中的外部变量无关。因此,当调用printf("%d\n", parent->value);时,parent仍然是无效指针。

您可以尝试通过指针(即指针指针)传递来完成它。如:

int func(int valueToFind, node_t **parentNode) {
//                               ~~
    while(node = node->next()) {
        if(node->value == valueToFind) {
            *parentNode = node->prev();
//          ~
            return 1;
        }
    }
    return 0;
}

if(1==func(16, &parent)) {//searching for value 16
//             ~
    printf("%d\n", parent->value);
}

答案 1 :(得分:1)

这是因为,在main()函数中,node_t *parent;main()的本地,并且您没有为其分配任何有效的内存。

也就是说,在通话中,您func(16, parent)使用了传递值parent,所以即使该功能是为了对parent进行任何更改,它也不会反映main()

所以,

 printf("%d\n", parent->value);

是无效的内存访问并调用undefined behavior

答案 2 :(得分:0)

你的问题在这里:

parentNode = node->prev();

这个指针变量是func()的本地变量。 如果你想保留它,你必须返回存储在其中的指针值。

func()返回后,本地parentNode消失了。

传递给func()的只是存储在父变量中的指针的副本。

请参阅此解决方案:

node_t *node = % first node initialization % ; //global

node_t* func(int valueToFind) {
    while(node = node->next()) {
        if(node->value == valueToFind) {
            return node->prev();
        }
    }
    return NULL;
}

int main() {
    node_t *parent = func(16);
    if(parent) {//searching for value 16
        printf("%d\n", parent->value);
    }
}

现在父母真的拿着一个指针或一个'记忆地址'。 并且父有一个 true 值,不同于0.在C中,每个0的值都为真。如果它为NULL(或0),则为 false 。< / p>