-1

我试图了解悬空指针在 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没有打印出来的值。

Isint*char*在功能范围方面被分开处理。

此外,在smart_pointers此处使用是否会以任何形式提供帮助?

4

2 回答 2

3

如您所知,不能保证返回指向局部变量的指针。因此,您get_int_ptr和您的get_char_ptr功能都不能正常工作。

(预示答案:“不保证工作”与“保证不工作”不太一样。)

你试验了你的get_int_ptr功能。令您惊讶的是,调用程序“正确”打印了 10。

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

我在我的车上工作。我拆下前轮修理刹车。当我重新装上前轮时,我忘记安装凸耳螺母,所以轮子并没有真正固定。然后我开车去商店买了一些牛奶。但是轮子没有掉下来。为什么不?

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

然后你试验了你的get_char_ptr功能。它失败了。这并不奇怪,除非你想象get_int_ptr实验的成功以某种方式证明了悬空指针毕竟是可以使用的。继续类比:

第二天,在车轮螺母仍然不见的情况下,我开车越野去探望年迈的祖母。到了一半,在高速公路上以每小时 60 英里的速度行驶时,前轮突然飞了起来,我撞到沟里,把我的车毁了。为什么会这样?

不用说,这是因为缺少凸耳螺母!前轮没有任何支撑,前一天你明显的“成功”,在那种破烂的情况下开车去商店,证明什么都没有。

我同意你的一个功能“有效”而另一个没有,这很有趣。但这基本上是随机事件。int*不,在这方面和指针之间没有区别char*:如果悬空,它们几乎同样可能不起作用。

有时可以解释为什么随机事件会以这种方式发生。但是,在这里,我不能。我已经在我的编译器下尝试了你的程序,我看到的结果完全相同。 get_int_ptr的局部变量i往往会存活下来,但get_char_ptr的局部数组str往往会被清除。我希望那部分str可能会幸存下来,但显然不会。但是,同样,我们无法解释行为并不重要,因为它是undefined

于 2018-05-12T18:00:02.533 回答
2

打印某些东西是偶然的。

两个指针都指向当函数返回时不再存在的局部变量。

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

任何事情都可能发生——程序可能会为你点披萨、炸开或打印一些东西——有时甚至是正确的值。

于 2018-05-12T17:53:03.233 回答