提问人:Kingkong Jnr 提问时间:8/29/2022 最后编辑:Vlad from MoscowKingkong Jnr 更新时间:8/29/2022 访问量:62
将指针传递到指针的行为很奇怪
Pass pointer to pointer behaves weird
问:
我正在解决二叉树的顺序遍历的 Leetcode 问题 #94。
我不明白为什么 - 当我使用(当前注释)时,调用程序可以正常工作,但当我使用时却不能。&cpy
helper()
&gResult
int countNode(struct TreeNode* root)
{
if(root)
return 1 + countNode(root->left) + countNode(root->right);
return 0;
}
void helper(struct TreeNode* root, int** res)
{
if(root)
{
helper(root->left, res);
*((*res)++) = root->val;
helper(root->right, res);
}
}
/**
* Note: The returned array must be malloced, assume caller calls free().
*/
int* inorderTraversal(struct TreeNode* root, int* returnSize){
int *gResult = NULL;
*returnSize = countNode(root);
gResult = (int*)malloc(((*returnSize)) * sizeof(int));
memset(gResult, 0, (*returnSize) * sizeof(int));
int *cpy = gResult;
// helper(root, &cpy);
helper(root, &gResult);
return gResult;
}
答:
1赞
Vlad from Moscow
8/29/2022
#1
该函数更改通过引用传递给函数的指针的值。helper
*((*res)++) = root->val;
^^^^^^^^
因此,调用函数后,原始指针不会指向分配的内存。
因此,使用中间指针,如以下代码片段所示
int *cpy = gResult;
helper(root, &cpy);
保持指向动态分配的内存的指针不变,并从函数返回。并且函数的调用者可以使用返回的指针成功释放分配的内存。gResult
inorderTraversal
评论
0赞
Kingkong Jnr
8/29/2022
谢谢。这很有道理。如果不进行复制,gResult 将指向最后一个整数之后的内存,因此释放该内存将出现错误。因此,从语法上讲,代码是正确的(因此它被编译了),但运行时存在问题。
0赞
Vlad from Moscow
8/29/2022
@KingkongJnr 你是对的:)
上一个:使用函数更改指针包含的地址
评论
&cpy
是指向 的指针。 只是一个指向 的指针。间接的层次少了一个。gResult
&gResult
gResult
int *cpy
并且两者都声明了一个指向 int 的指针。 将是指向指针的指针。这就是“helper()”所需要的。int *gPointer
&cpy
int *cpy = &gResult;