将指针传递到指针的行为很奇怪

Pass pointer to pointer behaves weird

提问人:Kingkong Jnr 提问时间:8/29/2022 最后编辑:Vlad from MoscowKingkong Jnr 更新时间:8/29/2022 访问量:62

问:

我正在解决二叉树的顺序遍历的 Leetcode 问题 #94。

我不明白为什么 - 当我使用(当前注释)时,调用程序可以正常工作,但当我使用时却不能。&cpyhelper()&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;
}

Error Snapshot

C 参数 传递引用 变量赋值

评论

0赞 Barmar 8/29/2022
&cpy是指向 的指针。 只是一个指向 的指针。间接的层次少了一个。gResult&gResultgResult
1赞 Barmar 8/29/2022
如果编译器未就类型不匹配向您发出警告,则需要提高警告级别。
0赞 Kingkong Jnr 8/29/2022
gResult 和 cpy 不是同一种类型吗?两个指针不是指向一个整数吗?int *cpy = gResult;这句话不是说 gResult 和 cpy 是一样的吗?
0赞 paulsm4 8/29/2022
int *cpy并且两者都声明了一个指向 int 的指针。 将是指向指针的指针。这就是“helper()”所需要的。int *gPointer&cpy
1赞 Barmar 8/29/2022
@KingkongJnr 你说得对,我误读了int *cpy = &gResult;

答:

1赞 Vlad from Moscow 8/29/2022 #1

该函数更改通过引用传递给函数的指针的值。helper

    *((*res)++) = root->val;
      ^^^^^^^^

因此,调用函数后,原始指针不会指向分配的内存。

因此,使用中间指针,如以下代码片段所示

int *cpy = gResult;
helper(root, &cpy);

保持指向动态分配的内存的指针不变,并从函数返回。并且函数的调用者可以使用返回的指针成功释放分配的内存。gResultinorderTraversal

评论

0赞 Kingkong Jnr 8/29/2022
谢谢。这很有道理。如果不进行复制,gResult 将指向最后一个整数之后的内存,因此释放该内存将出现错误。因此,从语法上讲,代码是正确的(因此它被编译了),但运行时存在问题。
0赞 Vlad from Moscow 8/29/2022
@KingkongJnr 你是对的:)