在整数指针与char指针的情况下悬空指针

时间:2018-05-12 17:50:16

标签: c++ pointers smart-pointers dangling-pointer

我试图理解悬空指针在c ++中是如何工作的。

int* get_int_ptr()
{
    int i=10;
    int* ptr;
    ptr = &i;
    return ptr;
}

char* get_char_ptr()
{
    char str[10];
    strcpy(str,"Hello!");
    return(str); 
}

int main()
{
    cout << *get_int_ptr() << endl;
    cout << get_char_ptr() << endl;
    return 0;
}

此代码的输出为 -

警告:

prog.cpp: In function 'char* get_char_ptr()':
prog.cpp:16:9: warning: address of local variable 'str' returned [-Wreturn-local-addr]
char str[10];
    ^

输出:

10

有人可以解释为什么i的值打印在main()函数中,即使返回的指针指向超出范围的i也是如此。

为什么不打印str的值。

int*char*是否按功能范围单独处理。

此外,在这里使用smart_pointers会以任何形式提供帮助吗?

2 个答案:

答案 0 :(得分:2)

打印某些东西是偶然的。

两个指针都指向函数返回时停止存在的局部变量。

这是未定义行为的经典例子。

任何事情都可能发生 - 程序可能会为您点上披萨,爆炸或打印某些东西 - 有时甚至是正确的价值。

答案 1 :(得分:2)

如您所知,返回指向局部变量的指针并不能保证正常工作。因此,您的get_int_ptrget_char_ptr功能都不会起作用。

(预示着答案:&#34;不能保证工作&#34;与#34不完全相同;保证不起作用&#34;。)

您尝试了get_int_ptr功能。令您惊讶的是,呼叫程序正确地#34;印刷10。

这是一个类比。你所做的就像这个小故事:

  

我正在开车。我拆下了前轮来修理刹车。当我重新打开前轮时,我忘了安装螺母,所以车轮并没有真正连接。然后我开车去商店买些牛奶。但车轮没有掉下来。为什么不呢?

答案是,你非常非常幸运。

然后您尝试了get_char_ptr功能。它失败了。这并不令人惊讶,除非你想象get_int_ptr实验的成功以某种方式证明悬挂指针毕竟是可以使用的。继续比喻:

  

第二天,由于耳环仍然缺失,我开车越野去探望我年迈的祖母。在那里的中途,当在高速公路上以每小时60英里的速度行驶时,前轮突然飞走了,我撞到了沟里,摧毁了我的车。为什么会这样?

毋庸置疑,发生这种情况是因为缺少螺母!没有任何东西挡住前轮,你的明显成功&#34;前一天,在那个破碎的条件下开车去商店,事实证明没有。

我同意你的一个功能&#34;工作&#34;而另一个没有。但它基本上是随机的偶然事件。不,在这方面,int*char*指针之间没有区别:如果悬空,它们两者同样可能不起作用。

有时可以用它的方式解释为什么随机偶然事件会发生。不过,在这里,我无法做到。我已经在我的编译器下尝试了你的程序,而且我看到了完全相同的结果。 get_int_ptr的本地变量i往往存活,但get_char_ptr的本地数组str往往会被清除。我希望str的一些可能存活,但显然不是。但是,再一次,我们无法解释这种行为并不重要,因为它未定义