先来一段这样的代码:
#include <stdio.h>
//堆和栈的差异
char* print_stack(){
char c[100]="hhhhhhhhhhhhhhhhh";
//这里c算是一个指针
puts(c);
char *p;
p=c;
return p;
}
int main() {
char *p;
p = print_stack();
puts(p);
return 0;
}
执行之后的结果:
可以看出打印之后乱码了(或者是空),这是因为函数执行结束之后,它的栈空间受操作系统的管理,栈空间会被释放,来给下一个函数使用。
如果使用堆空间:
char* print_malloc(){
char * p = (char*)malloc(100);
strcpy(p,"hhhhhhhhhhh");
puts(p);
return p;
}
int main() {
char *p;
p = print_malloc();
puts(p);
return 0;
}
则不会出现问题。因为堆空间申请以后不会因为函数结束以后得到释放,只要进程没有消亡就会一直存在。