函数返回空指针而不是地址

3
我在尝试使用指针来更好地理解这个概念,想问一下:
为什么第二个函数返回的是空指针?
为什么不能获得地址0x7fff15504044?当我在函数内部使用整数5时,在内存的哪个位置存储了它?
#include <iostream>
using namespace std;

int* return_adress(int* input){ return input; }

int* return_adress_from_input(int input){ return &input; }

int main(){
    int k = 3; 
    cout << return_adress(&k) << endl;
    cout << return_adress_from_input(k) << endl;
}

输出:
0x7fff15504044
0

因为这是未定义的行为。同时打开你的C++书籍,查看解释参数如何按值传递的章节。 - Sam Varshavchik
可以从其作用域外部访问局部变量的内存吗?传递引用和传递值有什么区别? - NathanOliver
2
你可能想通过引用而不是值来获取“input”:int input => int& input - AMA
@AMA:那么建议OP将返回类型更改为const int* - Bathsheba
@Bathsheba 在你打字的时候修复了 :) - AMA
2
@AMA:如果我继续打字,你也会帮我修复代码中的错误吗?;-)? - Bathsheba
2个回答

7
使用int* return_adress_from_input(int input)函数,input是调用者中k的值副本。它们是两个不同的变量,因此具有不同的地址。
一旦函数结束符号被执行,概念上input就超出了范围。
指针&input随后指向您不再拥有的内存,读取该指针值的行为(更不用说对其进行解引用)在C++14之前是未定义的,并从C++14起包含在实现定义中。

2
自C++14起,它的实现是定义的。 - Passer By
@路人甲:所以这就是:它解释了nullptr的值。 - Bathsheba

1
因为你是按值传递input,而不是按引用传递。编译器首先创建input的本地副本,然后返回该本地副本的地址。要获取变量地址,请使用。
int* return_adress_from_input(int& input){ return &input; }

一般来说,在特定情况下,您会得到未定义的行为,可能导致返回nullptr
在我的电脑上,我得到的是:
00AFFC80
00AFFBA8

所以你只是运气好,没有返回值


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接