运算符优先级和指针算术

时间:2013-05-31 03:20:25

标签: c++ pointers scope rvalue

给出以下代码:

void Allocate(int *p)
{
    p = new int;
    *p++ = 2;
}

int main()
{
    int i = 10;
    Allocate(&i);
    std::cout << i << std::endl;
}

我有点担心的意思:

*p++ = 2;

输出为10,我的理由是*p++是临时的,因此Allocate(int *p)范围的末尾会丢失对{{1}}的任何赋值。

是这样的吗? 谢谢你!

5 个答案:

答案 0 :(得分:4)

  • 在输入Allocate后,p指向i中的变量main 功能
  • 然后该变量的地址丢失并替换为 new int
  • 此int的值(未初始化,因此可以 以任何方式开始)设置为2。
  • p指针递增。
  • Allocate函数此时返回,泄漏的是int 分配
  • i函数中main的值不变, 因为Allocate没有修改它。

答案 1 :(得分:3)

p = new int;

您指定p新内存指向而不是之前指向的内容。然后,您更改此新分配的内存,并在函数结束时永久丢失,从而导致内存泄漏。如果删除分配行,则应该输出2.在这种情况下,++不执行任何操作。它只是递增指针并将旧值返回到取消引用。

答案 2 :(得分:3)

当你将i的地址传递给Allocate时,会创建另一个(临时)指针指向i的地址(即通过指针传递)。那个临时指针指向一个新位置(通过new int)。因此,i的价值就不复存在了。

here's a crappy illustration i drew

答案 3 :(得分:2)

只要您输入Allocate,就会指定p指向新的内存块,因此它不再指向i。然后修改新的内存块(当方法返回时会泄漏。)i不受影响,因为在设置指向内存单元之前已经移动了指针。

答案 4 :(得分:0)

void Allocate(int **p)
{
    *p = new int;
    **p = 2;
}


int main()
{
    int j = 10;
    int *i = &j;
    std::cout << i << std::endl;
    Allocate(&i);
    std::cout << i << std::endl;
}

输出是:    10    2

您需要一个指向指针的指针来更改指向的位置的地址。