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.
我尝试将指针从函数传递到链表节点。
这是伪代码(我使用的是 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.