Return 从函数指向链表节点的指针

Return pointer to the node of the linked list from the function

我尝试将指针从函数传递到链表节点。
这是伪代码(我使用的是 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);程序崩溃的那一行。
我究竟做错了什么?

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

也就是说,在调用中,func(16, parent) 您已经使用按值传递传递了 parent,因此即使该函数打算对 parent 进行任何更改,它不会反射回main()

所以,

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

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

func()的参数parentNode是按值传递的,也就是说即使你在函数内部改变了它的值,它与main()中的外部变量无关.所以当printf("%d\n", parent->value);被调用时,parent仍然是一个无效的指针。

您可以尝试 passed by pointer(即指针的指针)来完成它。如:

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);
}

你的问题在这里:

parentNode = node->prev();

这个指针变量是 func() 的局部变量。 如果要保留它,则必须return将指针值存储在其中。

func()returns后,本地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);
    }
}

现在 parent 真的拿着一个指针,或者说 'memory address'。 并且 parent 有一个 true 值,即与 0 不同。在 C 中,每个与 0 不同的值都是 true。如果它为 NULL(或 0),则为 false.