好吧,我们有一个函数调用incr,它只是将数字增加1,然后返回新值,但将指针作为参数:
int incr(int *arg)
{
*arg++;
return *arg;
}
Run Code Online (Sandbox Code Playgroud)
所以,如果我们写下以下内容:
int main()
{
int i = 1, j = 0;
cout << j << endl;
int* p_i = &i;
j = incr(p_i); // changes both i and j
cout << i << ", " << j << endl; //should print 2, 2
return 0;
}
Run Code Online (Sandbox Code Playgroud)
因为我们使用变量的指针作为参数i,如果函数*p_i内部发生了某些事情incr,那么更改对于i何时incr完成也是永久性的.也因为我们设置j=incr(i)并且我们不返回p_i自己,但是它的内容(现在是2的值)i),j现在应该是2.但由于某种原因,结果如下:
1, -858993460
Run Code Online (Sandbox Code Playgroud)
而我根本不明白为什么.也许我在这个洞指针/函数调用的东西中理解了一些错误.任何帮助都会被批评
这是运营商优先问题.
operator++优先级高于operator*,因此您递增地址,然后取消引用它.
(*arg)++;
Run Code Online (Sandbox Code Playgroud)
将解决您的问题.
*arg++;将被解析为*(arg++);因为运算符优先++于解除引用运算符*.它将递增指针arg,然后获取未初始化的递增指针的值.在这种情况下,您的程序可能会调用未定义的行为.
您需要将其更改为(*arg)++;.
| 归档时间: |
|
| 查看次数: |
122 次 |
| 最近记录: |