局部变量问题
当子函数结束以后,其局部变量是否被销毁了呢?
局部变量存储在栈区,栈区是由编译器自动分配释放。
常量字符串存储在堆区,堆区一般是由程序员分配和释放,否则就由OS回收。
堆和栈的问题请参考:http://blog.chinaunix.net/space.php?uid=25119314&do=blog&id=188248
下面是我写的两个小测试程序:
- char *str_func_1()
-
-
{
-
-
char *p;
-
-
p = "hello CJOK";
-
-
}
-
-
-
-
char *str_func_2()
-
-
{
-
-
char p[12] = "hello CJOK";
-
-
return p;
-
-
}
-
-
-
-
int main()
-
-
{
-
-
char *strp;
-
-
strp = str_func();
-
-
printf("%s\n", strp);
-
-
return 0;
-
-
}
这是Str_func_1()打印出来的结果:
- cjok@ubuntu:~/c$ gcc tst.c -o tst
-
cjok@ubuntu:~/c$ ./tst
-
hello CJOK
Str_func_1() 验证了常量字符串存储在堆区,只有当程序结束后才被OS回收掉。
这是Str_func_2()打印出来的结果:
- cjok@ubuntu:~/c$ gcc tst.c -o tst
-
tst.c: In function ‘str_func’:
-
tst.c:8: warning: function returns address of local variable
- cjok@ubuntu:~/c$ ./tst
- ���
说明局部变量p[]已经发生了变化,是不是已经被销毁了呢,还不敢下结论。
又写了一个测试程序:
- int *num_func()
-
-
{
-
-
int num = 63178;
-
-
return #
-
-
}
-
-
-
-
int main()
-
-
{
-
-
int *nump;
-
-
nump = num_func();
-
-
printf("%d\n", *nump);
-
-
return 0;
-
-
}
执行结果:
- cjok@ubuntu:~/c$ gcc tst.c -o tst
- tst.c: In function ‘num_func’:
-
tst.c:14: warning: function returns address of local variable
-
cjok@ubuntu:~/c$ ./tst
-
63178
在编译的时候出现了警告,但是在执行的时候,却打印出正确的结果。很令人费解。
在网上搜罗了大量的文章,我觉得这个讲的不错:
http://tech.cuit.edu.cn/forum/redirect.php?tid=4862&goto=lastpost
子函数结束后,其局部变量就变得不稳定,可能被销毁,也有可能还在,所以建议别用。
***如有问题,请指正,谢谢!***
liao.ye@foxmail.com
阅读(7531) | 评论(0) | 转发(0) |