思考:此程序会输出 hello world 吗?
在VS2019下测试的结果如下:
为什么呢?下面来解释一下原因:
首先,来了解一下C语言中内存区域划分的常识
从而,我们得知,函数的局部变量存放在栈区,它的生命周期仅限制在函数域内,即函数执行时被创建,函数结束后被销毁。
分析题目:
1. 指针p是函数的局部变量,存放的是一个字符数组的首元素h的地址,在GetMemory()函数结束时返回该地址,保存在str指针变量中。
2. 然而,在GetMemory()函数结束后,它内部的局部变量会销毁,包括字符数组,将其占用的内存空间释放,归还给操作系统。
3. 所以,函数结束后,str内部记录的地址已不再是曾经的数组首元素地址,此时str指向一个未知的空间,成为野指针。
在printf()时,也不能通过str如愿找到整个字符数组打印出来。