我最近遇到了一些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;
}
以下是我的思维方式解析代码:
第一次拨打fun()
会将地址传递给arr
在fun()
内,p
已取消,而'b'已分配到c
p
再次被取消引用并递增为“c”
值{b'从fun()
非常直截了当。
现在,第二次调用fun()
是我遇到麻烦的地方。由于此时p
和c
都超出了范围,我假设对fun()
的第二次调用将产生完全相同的结果 - 显然不同的是返回值将打印到屏幕而不是丢弃。但是,而不是'b',结果是'c' - 事实上,对fun(arr + 1)
的额外调用进一步将返回值递增到d,e,f,g,h等,随后每次调用
我知道即使在指针超出范围之后,该值仍存储在堆栈中,但我无法弄清楚即使在指针被销毁之后该值仍然是如何被引用的。
答案 0 :(得分:1)
(* P)++;
参考文献[1]。
每次执行此操作时,都会在arr [1]中递增值。那是&#39; b&#39;第一次,&#39; c&#39;第二,等等。