gpt4 book ai didi

c - 指针在整个函数调用过程中保存信息

转载 作者:太空宇宙 更新时间:2023-11-04 07:39:42 25 4
gpt4 key购买 nike

我对函数调用之间的指针发生了什么感到有点困惑。这不是我所期望的。我有以下情况:

SomeClass *p1= 0, *p2 = 0;
SomeMethod(p1, p2);
printf("P1 total: %d\n", p1->total); // crashes
printf("P2 total: %d\n", p2->total); // crashes

// method someMethod, where the values of the pointers are valid
void SomeMethod(SomeClass *p1, SomeClass *p2)
{
someMethodThatModifiesThePointers(&p1, &p2);
printf("P1 total: %d\n", p1->total); // prints valid value
printf("P2 total: %d\n", p2->total); // prints valid value
};

从我的评论中可以看出,指针的 .total 属性(整数)在方法内部有效,但在方法外部不再有效。为什么会这样?指针不应该失去作用域。

准确的说,someMethodThatModifiesThePointers()就是opencv的cvExtractSURF。我删除了代码以保持简单。

最佳答案

C 是一种按值传递的语言。这意味着原始函数中的指针不能通过调用 SomeMethod() 来更改(顺便说一下,C 没有方法)。你在注释行上崩溃了,因为 p1p2 当时仍然是空指针。

内部 SomeMethod() 的指针也是如此。如果将空指针传递给 SomeMethod(),注释为 prints valid value 的代码行也会因同样的原因崩溃。你不可能得到你说的输出,至少给定你已经显示的代码。如果您在示例中犯了错误,并且您的意思是:

    someMethodThatModifiesThePointers(&p1, &p2);

它可能按照您解释的方式工作 - p1p2 然后通过引用传递(也就是说,您传递的是指向指针的指针按值),并且它们的值可以在 SomeMethod() 中有效。但是,您代码顶部的 p1p2 的原始副本仍然会有空指针。

您可以通过执行相同的操作来解决您的问题 - 通过引用将 p1p2 传递给 SomeMethod():

 SomeMethod(&p1, &p2);

该更改将要求您在 SomeMethod() 中进行一些修改:

void SomeMethod(SomeClass **p1, SomeClass **p2)
{
someMethodThatModifiesThePointers(p1, p2);
printf("P1 total: %d\n", (*p1)->total);
printf("P2 total: %d\n", (*p2)->total);
};

在此调用之后,您的顶级函数中的 p1p2 将按您希望的方式运行。

关于c - 指针在整个函数调用过程中保存信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5436321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com