关于C++中 `f(int *&p)` 的return值调用方法?

上课的时候提到了可以有 f(int *&p) 这种写法,我测试了一下,发现

#include <iostream>
using namespace std;

int f(int *&p) {p++; cout << "p|&p : " << p << '\t' << &p << endl; return *p;}

int main() {
    int *x = 0;
    int *y = 0;
    *y = f(x);
    cout << "*y : " << *y << endl;
    return 0;
}

和:

#include <iostream>
using namespace std;

int &f(int *&p) {p++; cout << "p|&p : " << p << '\t' << &p << endl; return *p;}

int main() {
    int *x = 0;
    int *y = 0;
    *y = f(x);
    cout << "y|&y : " << y << '\t' << &y << endl;
    return 0;
}

这两种方法有点问题,不能输出y,在 cout << "y|&y : " …… 这一句之前就断掉了。用 clang++ -Wall 没有任何warning。改成 *f(int *&p) 形式:

#include <iostream>
using namespace std;

int *f(int *&p) {p++; cout << "p|&p : " << p << '\t' << &p << endl; return p;}

int main() {
    int *x = 0;
    int *y = 0;
    y = f(x);
    cout << "y|&y : " << y << '\t' << &y << endl;
    return 0;
}

这样才有输出为:

p|&p : 0x4      0x61fe10
y|&y : 0x4      0x61fe08

所以前两种方法错在那?还有第三种方法的0x4代表什么?

阅读 1.7k
1 个回答

全是 UB (undefined behavior, 未定义行为)。

int *x = 0; 这个实际是一个空指针。通过它无论读写其中的值都可能是运行时错误。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题