C指针以及为什么不能返回局部指针变量,却可以返回局部变量
2018-02-24 10:10
495 查看
指针,是一个无符号整数(unsigned int),它是一个以当前系统寻址范围为取值范围的整数。
如:int* 是一个指针变量类型
指针变量和普通变量没有什么区别,指针32位四字节,里面保存的是一个内存空间的地址,
就像一个整形变量int a, a就可以代表一个整数,一个指针变量int* p,p就可以代表一个
地址数据,而*地址,代表去这个地址指向的内存空间取出里面的内容,因此如果是要取出
这个指针所指向的内存里面的内容就是*p,而如果是需要获得那个内存的地址,或者让另外
一个指针指向这个空间时,就可以使用int* pb;pb=p;
&变量名这是获取保存这个变量的内存空间地址
应该说c语言是门十分灵活的语言,类型几乎可以说无所谓了,有的只有内存和读取的方式
,什么几级指针,都没有意义,就算是一整形,只要强转,也可以当作地址数据来用,只是
可能会段错误,因为没有做地址映射
*p代表的是地址里面的保存的值
p代表的是一个指针变量
int* p[10] *和[]优先级相同,平级右结合 p为一个数组,包含了10个指针变量
int (* p)[10] p为指向一个数组的指针
为什么不能返回局部指针变量,却可以返回局部变量
函数的局部变量用作返回值时,会生成一个局部变量的拷贝用作返回值,之后局部变量会被系统回收,函数不能返回局部变量的地址,因为如果返回局部变量的地址,系统回收后,指针指向的内容就无意义了,但是对于静态变量也可以返回其指针。
#include "stdio.h"
int *a()
{
int b;
int *p;
b=23;
printf("b=%d \n",b);
return &b;
}
void main()
{
int *r;
r=a();
//printf("");
printf("r=%d",*r);
getch();
}
如以上代码,函数返回的是局部变量的指针,此时在主函数里打印出的r应该不等于23,可是实际结果却是23,当在打印结果之前再添
加一个printf语句时打印的结果才不会是23,在CSDN上讨论:http://topic.csdn.net/u/20120206/22/487c9e4f-bf36-4ed1-9e6a-a6e7
cb7404e5.html?seed=1431559918&r=77464424#r_77464424,这里系统可能没及时回收局部变量才导致打印出的还是局部变量的值
具体的应该如下:
1. 如果返回一个基本类型的变量,比如:
int a;
a = 5;
return a;
那么就会a的一个拷贝,即5返回,然后a就被销毁了。尽管a被销毁了,但它的副本5还是成功地返回了,所以这样做没有问题。
2. 但是对于指针,像1那么做就会有问题,比如在某个函数内部:
int a[] = {1, 2};
return a;
那么也会返回指针a的一个拷贝,我们假定a的地址值为0x002345FC,那么这个0x2345FC是能够成功返回的。当return执行完成后,a就
要被销毁,也就是0x002345FC所指向的内存被回收了。如果这时候在函数外面,去地址0x002345FC取值,那得到的结果肯定是不对的
。这就是为什么不能返回局部指针的原因。返回局部变量的引用的道理和这个类似。
3. 对于静态变量:
static int b=10;
return &b;
由于静态变量是存放在静态存储区的,所以不会被系统回收,所以返回值还是有效的。
如:int* 是一个指针变量类型
指针变量和普通变量没有什么区别,指针32位四字节,里面保存的是一个内存空间的地址,
就像一个整形变量int a, a就可以代表一个整数,一个指针变量int* p,p就可以代表一个
地址数据,而*地址,代表去这个地址指向的内存空间取出里面的内容,因此如果是要取出
这个指针所指向的内存里面的内容就是*p,而如果是需要获得那个内存的地址,或者让另外
一个指针指向这个空间时,就可以使用int* pb;pb=p;
&变量名这是获取保存这个变量的内存空间地址
应该说c语言是门十分灵活的语言,类型几乎可以说无所谓了,有的只有内存和读取的方式
,什么几级指针,都没有意义,就算是一整形,只要强转,也可以当作地址数据来用,只是
可能会段错误,因为没有做地址映射
*p代表的是地址里面的保存的值
p代表的是一个指针变量
int* p[10] *和[]优先级相同,平级右结合 p为一个数组,包含了10个指针变量
int (* p)[10] p为指向一个数组的指针
为什么不能返回局部指针变量,却可以返回局部变量
函数的局部变量用作返回值时,会生成一个局部变量的拷贝用作返回值,之后局部变量会被系统回收,函数不能返回局部变量的地址,因为如果返回局部变量的地址,系统回收后,指针指向的内容就无意义了,但是对于静态变量也可以返回其指针。
#include "stdio.h"
int *a()
{
int b;
int *p;
b=23;
printf("b=%d \n",b);
return &b;
}
void main()
{
int *r;
r=a();
//printf("");
printf("r=%d",*r);
getch();
}
如以上代码,函数返回的是局部变量的指针,此时在主函数里打印出的r应该不等于23,可是实际结果却是23,当在打印结果之前再添
加一个printf语句时打印的结果才不会是23,在CSDN上讨论:http://topic.csdn.net/u/20120206/22/487c9e4f-bf36-4ed1-9e6a-a6e7
cb7404e5.html?seed=1431559918&r=77464424#r_77464424,这里系统可能没及时回收局部变量才导致打印出的还是局部变量的值
具体的应该如下:
1. 如果返回一个基本类型的变量,比如:
int a;
a = 5;
return a;
那么就会a的一个拷贝,即5返回,然后a就被销毁了。尽管a被销毁了,但它的副本5还是成功地返回了,所以这样做没有问题。
2. 但是对于指针,像1那么做就会有问题,比如在某个函数内部:
int a[] = {1, 2};
return a;
那么也会返回指针a的一个拷贝,我们假定a的地址值为0x002345FC,那么这个0x2345FC是能够成功返回的。当return执行完成后,a就
要被销毁,也就是0x002345FC所指向的内存被回收了。如果这时候在函数外面,去地址0x002345FC取值,那得到的结果肯定是不对的
。这就是为什么不能返回局部指针的原因。返回局部变量的引用的道理和这个类似。
3. 对于静态变量:
static int b=10;
return &b;
由于静态变量是存放在静态存储区的,所以不会被系统回收,所以返回值还是有效的。
相关文章推荐
- C指针以及为什么不能返回局部指针变量,却可以返回局部变量
- 为什么不能从子函数中返回临时对象的指针和引用,却可以返回一个临时变量的值
- 函数不能返回局部指针变量
- return可以返回基本类型的局部变量,但是不可以返回指针
- 为什么C++中千万不要返回局部对象或变量的引用和指针
- 为什么C++中千万不要返回局部对象或变量的引用和指针
- C语言学习7 :二级指针定义,强制转换,多级指针初步,6级指针构造,错误应用*p=&a,错误应用 二级p2,void型指针的兼容性,malloc函数基本用法,malloc分配空间和堆栈空间的区别,验证malloc函数内存的分配,验证malloc函数的越界,内存泄漏,指针不能返回局部变量地址,内存分配
- 为什么在函数中不能通过指针返回本地定义的变量
- 为什么返回值为数值时,返回局部变量可以,而返回值为引用时,返回局部变量不可以?
- 《为什么非静态内部类中不能有static属性的变量,却可以有static final属性的变量?》
- C语言中,为什么字符串可以赋值给字符指针变量
- 不能向局部变量赋予默认值以及必须声明标量变量——sqlserver存储过程
- 用transient修饰的成员变量不能序列化,为什么ArrayList集合可以实现序列化
- 返回局部变量和指针
- 返回指向局部变量指针的函数 与 返回局部变量引用的函数
- 大数组定义在main函数中不能执行,为什么将其定义为全局变量就可以执行?
- 局部指针变量为什么可以正确返回?
- effective C++笔记之条款31、32: 千万不要返回局部对象的引用,也不要返回函数内部用new初始化的指针所指对象的引用、尽可能地推迟变量的定义
- 为什么不能返回局部对象的应用
- c++中函数中变量内存分配以及返回指针、引用类型的思考