返回局部变量指针
2010-12-24 17:52
405 查看
一般我们都知道不能返回局部变量的指针,但很多人知道其然,不知道所以然,那么接下来我们分析一下,先看两段代码
/*test1.c*/
#include <stdio.h>
char* get_str()
{
char str[] = {"hello"};
return str;
}
int main()
{
char* p = get_str();
printf("%s/n", p);
return 0;
}
====================
/*test2.c*/
#include <stdio.h>
char* get_str()
{
char *str = {"hello"};
return str;
}
int main()
{
char* p = get_str();
printf("%s/n", p);
return 0;
}
test2.c运行是没有问题的,也可以打印出正确的值,而test1.c却是错误的,打印出来的值和预期的完全不一样。他们都是返回了局部变量的指针,为什么会有差异呢,我们仔细看代码,发现他们只有一个地方不一样,那就是test1.c 里面str是一个数组,test2.c里面str是一个指针。原因就在这,str指针,其值是一个常量,而常量是放在数据段里面的,即便函数返回了,数据段里面的常量数据也还会在,直到程序结束才会消失,所以我们可以打印出来。
而对于数组来说,它是一个局部变量,是放在栈里面的,函数返回之后,str指向的空间还是在的,如果我们打印出它的地址还是没有变。那么为什么内容会变掉呢,难道是系统会把栈中的数据清除,答案是否定的,因为这样做会消耗系统的资源,而且没有任何好处,下次用到这块内存还是会进行初始化的。打印出来的内容变掉是因为printf本身也是一个函数,也会进行参数的压栈,在压栈的过程中会把原来str指向的空间覆盖掉,也就改变了其中的值。如果我们在get_str之后,不调用任何函数并不创建新的局部变量(严格的说是不使栈继续往下增长),这个时候p指向的内容还是没变的。
/*test1.c*/
#include <stdio.h>
char* get_str()
{
char str[] = {"hello"};
return str;
}
int main()
{
char* p = get_str();
printf("%s/n", p);
return 0;
}
====================
/*test2.c*/
#include <stdio.h>
char* get_str()
{
char *str = {"hello"};
return str;
}
int main()
{
char* p = get_str();
printf("%s/n", p);
return 0;
}
test2.c运行是没有问题的,也可以打印出正确的值,而test1.c却是错误的,打印出来的值和预期的完全不一样。他们都是返回了局部变量的指针,为什么会有差异呢,我们仔细看代码,发现他们只有一个地方不一样,那就是test1.c 里面str是一个数组,test2.c里面str是一个指针。原因就在这,str指针,其值是一个常量,而常量是放在数据段里面的,即便函数返回了,数据段里面的常量数据也还会在,直到程序结束才会消失,所以我们可以打印出来。
而对于数组来说,它是一个局部变量,是放在栈里面的,函数返回之后,str指向的空间还是在的,如果我们打印出它的地址还是没有变。那么为什么内容会变掉呢,难道是系统会把栈中的数据清除,答案是否定的,因为这样做会消耗系统的资源,而且没有任何好处,下次用到这块内存还是会进行初始化的。打印出来的内容变掉是因为printf本身也是一个函数,也会进行参数的压栈,在压栈的过程中会把原来str指向的空间覆盖掉,也就改变了其中的值。如果我们在get_str之后,不调用任何函数并不创建新的局部变量(严格的说是不使栈继续往下增长),这个时候p指向的内容还是没变的。
相关文章推荐
- 返回指向局部变量的指针或引用
- 返回局部变量和指针
- 返回局部变量、局部变量的引用和指向局部变量的指针
- C/C++ 子函数返回局部变量、指针 和改变指针指向
- 返回指向局部变量的指针或引用
- 杜绝返回函数内局部变量的指针或引用
- 返回指向局部变量的指针或引用的带来的问题讨论
- 为什么C++中千万不要返回局部对象或变量的引用和指针
- 返回指向局部变量的指针或引用的问题
- 返回指向局部变量的指针或引用的带来的问题讨论
- 返回局部变量指针
- C指针以及为什么不能返回局部指针变量,却可以返回局部变量
- 返回局部变量指针
- 返回指向局部变量指针的函数 与 返回局部变量引用的函数
- C++函数返回局部变量指针的问题
- c语言中函数返回局部变量的指针(一些容易犯错的地方)
- effective C++笔记之条款31、32: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针所指对象的引用、尽可能地推迟变量的定义
- C语言学习7 :二级指针定义,强制转换,多级指针初步,6级指针构造,错误应用*p=&a,错误应用 二级p2,void型指针的兼容性,malloc函数基本用法,malloc分配空间和堆栈空间的区别,验证malloc函数内存的分配,验证malloc函数的越界,内存泄漏,指针不能返回局部变量地址,内存分配
- 不要返回指向局部变量的指针
- 返回局部变量指针的问题