来自超出范围的Poiner的意外输出

时间:2017-09-17 03:13:03

标签: c++ pointers scope

我最近遇到了一些C ++代码,我试图理解为什么输出不是我所期望的。以下是有问题的代码:

char fun(char *p)
{
   char c = *p;
   (*p)++;
   return c;
}

int main()
{
    char arr[3]={'a', 'b', 'c'};
    fun(arr + 1);
    std::cout << fun(arr + 1);
    return 0;
}

以下是我的思维方式解析代码:

  1. 第一次拨打fun()会将地址传递给arr

  2. 中存储'b'的地方
  3. fun()内,p已取消,而'b'已分配到c

  4. p再次被取消引用并递增为“c”

  5. 值{b'从fun()

  6. 返回

    非常直截了当。

    现在,第二次调用fun()是我遇到麻烦的地方。由于此时pc都超出了范围,我假设对fun()的第二次调用将产生完全相同的结果 - 显然不同的是返回值将打印到屏幕而不是丢弃。但是,而不是'b',结果是'c' - 事实上,对fun(arr + 1)的额外调用进一步将返回值递增到d,e,f,g,h等,随后每次调用

    我知道即使在指针超出范围之后,该值仍存储在堆栈中,但我无法弄清楚即使在指针被销毁之后该值仍然是如何被引用的。

1 个答案:

答案 0 :(得分:1)

  

(* P)++;

参考文献[1]。

每次执行此操作时,都会在arr [1]中递增值。那是&#39; b&#39;第一次,&#39; c&#39;第二,等等。