我们的栈空间,实际是内存分配的一个空间,当主函数执行完了定义的栈空间,内存会自动释放这个空间,也就是这个空间会【消失】,想要【再次执行】,会输出乱码。
#include <stdio.h>
//堆和栈的差异
char * print_stack()
{
char c[100]="I am print_stack func"; //初始化一个数组字符指针
char *p; //定义一个字符指针
p=c; //把数组指针赋地址给指针p
puts(p); //然后输出p的指针地址的数组。
return p; //把p的指地址,返回给主函数。
}
int main() {
char *p;
p=print_stack();
puts(p);
return 0;
}
首先:p=print_stack();//当我已经调用完了* print_stack的栈空间,内存会自动释放,这个空间也会消失。
然后:puts(p); //当我们再次输出指针p指向的数组指针时,发现这个空间以消失,但栈空间的最后有个【return p】;他把p的指针地址返回了主函数。然后主函数执行puts(p);找到这个地址,发现栈空间已经消失了,所以最后我们会出现【乱码】。这也是栈空间的机制 。
注意:这也是栈空间和堆空间的差异。栈空间内存管理,内存自动的释放空间。而堆空间是我们【借】的空间,什么时候【还】是我们自己的事情。
如果遇到主函数多次调用一个空间,那么我们就应该选用【堆空间】。