我尝试将指针从函数传递给链表节点 这里是伪代码(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);
行
我究竟做错了什么?
答案 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>