栈指针以及进程环境

这两天在看APUE的进程环境这章,看着看着就觉得自己对可执行文件在内存中的分配理解的一点也不清楚,花了很长时间终于弄明白了,下面我依次说说跟这些有关的内容。

C语言进程在运行时,可以分成几个段,这些段从低地址到高地址分别是正文段,初始化数据段、非初始化数据段(bss),栈以及堆。可以在一个可执行文件上运行size命令看到各个段的情况。其中程序的局部变量时存在栈里的,经过初始化的全局和静态变量是存在初始化数据段,bss段存储非初始化的全局变量,然后有一个问题出来了,我们经常看到说不能返回指向局部变量的指针,结果我在程序里验证后发现没有问题,程序如下:

int *fun();
main()
{
int *p;
p=fun();
printf("\n%d",*p);
}

int *fun()
{
int b;
int *str=&b;*str=1;
return str;
}

结果仍然能打出结果1,为什么?

原因是虽然在函数fun()执行结束后b的空间被释放了,b所在的空间的值在短时间内还没有被覆盖,c空间的值还没有被来的及重新分配和占用,如果在printf语句之前多调用几个函数就可以覆盖了。


接着,我又试了C专家编程上的例子:


char * favourite_fruit(){


char delicious[]="apple";


return decidous;


}

结果这个例子就会打印乱码,如果在delicious上佳关键字static就可以运行,但是如果将数组改为char *d=“apple”就可以运行这和前面的有啥区别?

其实,对于第一个例子的字符串数组,由于数组是局部变量,所以是将整个数组放在栈里存取,当函数返回后,那块内存就释放了,所以这种情况跟最上面的例子是一样的,而对于字符串指针,是将数组看成常量放在静态区里的,所以无论函数是否返回,这个字符串常量始终存在,所以就不会出现乱码的情况,不用static也一样能打印出

你可能感兴趣的:(指针)