C语言 返回指针的函数 问题
我现在对基础C语言有个疑问:就是返回指针的函数,如果你函数里面定义了一个指针变量,然后将其返回的话,那么函数结束完了那个变量不是没了吗?为什么主调函数中还能使用它返回的地...
我现在对基础C语言有个疑问:就是返回指针的函数,如果你函数里面定义了一个指针变量,然后将其返回的话,那么函数结束完了那个变量不是没了吗?为什么主调函数中还能使用它返回的地址呢?
如果是return i,主调函数知道一个i就可以了,但如果是返回一个指针的话,指针指向的地址里面的东西已经随着子函数的离去而离去了,那返回的那个地址不是已经没有意义了?????????????????? 展开
如果是return i,主调函数知道一个i就可以了,但如果是返回一个指针的话,指针指向的地址里面的东西已经随着子函数的离去而离去了,那返回的那个地址不是已经没有意义了?????????????????? 展开
5个回答
展开全部
返回指针 要看这个局部指针变量在函数运行后 保存了哪个空间的地址了
指针里的值是可以返回的 就像你说的 “ return i,主调函数知道一个i就可以了 ”
同样主函数 知道一个指针里的地址就可以了。
但是这个地址入口的空间现在可用否,那要看具体情况了
1 此地址所指向的空间 是个局部变量 也就是存在栈区,那么在申请次局部变量的函数结束时,局部变量被释放,用户没有使用他的权限了 出错
2 此地址所指向的空间 不是局部变量,比如是个静态变量 全局变量 或者是malloc申请的存在堆中的,那么他就不是你随着函数的离去二离去了,他任然存在,结果可用 正确
指针里的值是可以返回的 就像你说的 “ return i,主调函数知道一个i就可以了 ”
同样主函数 知道一个指针里的地址就可以了。
但是这个地址入口的空间现在可用否,那要看具体情况了
1 此地址所指向的空间 是个局部变量 也就是存在栈区,那么在申请次局部变量的函数结束时,局部变量被释放,用户没有使用他的权限了 出错
2 此地址所指向的空间 不是局部变量,比如是个静态变量 全局变量 或者是malloc申请的存在堆中的,那么他就不是你随着函数的离去二离去了,他任然存在,结果可用 正确
追问
我写了一个子函数 int *point(void) ,在里面 int a=1; return &a; 主函数里面 int *p; p=point(); printf("*p = %d\n", *p);
按理说这样是错的,是的,编译的时候也会报错,但输出来*p = 1; 我就傻了。然后我在
p=point(); printf("*p = %d\n", *p);中间加了几句,输出来*p = 0;
会不会是可能1还在,经过一些操作后就被覆盖了,但为什么会这样?它放在哪里,栈?堆?寄存器?(ubuntu下用gcc)
追答
1 是常量
常量数据区存储字符串等在编译期间就能确定的值。类对象不能存在于这个区域中。在程序的整个生存周期内,区域中的数据都是可用的
说实话我也试了你说的。
也有点相通
展开全部
在你定义变量的时候,会分配一个内存给变量,指针就是告诉你这个变量存在什么,C语言不会自动回收内存(一些计算机语言会自动回收内存,如java),除非你自己编写函数清除,或则改变其值,不然指针所指向地址里面的值是不会变化的。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
LZ 你好,这个问题,如果你学过汇编语言,通过汇编调试可以看的很清楚,汇编之下,鸟无秘密
更多追问追答
追问
学过,但怎么用啊!
追答
以VC6 为例,写个程序 随便下个断点,然后,F5调试,然后 VIEW菜单,下面的disaseembly
就可以看到汇编过程,很清楚
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你理解的方向是对的,不过存在以下几个问题
1.指针变量简单的话就是指向内存的某个地方
2.至于“指针指向的地址里面的东西已经随着子函数的离去而离去了”,这个就要看情况,
a.如果指针指向的那块内存是自动释放的,那么它就会随“子函数的离去而离去”.例如 局部变量
b.如果那块内存不会自动释放的,那他就不会随“子函数的离去而离去”例如,用malloc()申请的内存空间
1.指针变量简单的话就是指向内存的某个地方
2.至于“指针指向的地址里面的东西已经随着子函数的离去而离去了”,这个就要看情况,
a.如果指针指向的那块内存是自动释放的,那么它就会随“子函数的离去而离去”.例如 局部变量
b.如果那块内存不会自动释放的,那他就不会随“子函数的离去而离去”例如,用malloc()申请的内存空间
追问
我写了一个子函数 int *point(void) ,在里面 int a=1; return &a; 主函数里面 int *p; p=point(); printf("*p = %d\n", *p);
按理说这样是错的,是的,编译的时候也会报错,但输出来*p = 1; 我就傻了。然后我在
p=point(); printf("*p = %d\n", *p);中间加了几句,输出来*p = 0;
会不会是可能1还在,经过一些操作后就被覆盖了,但为什么会这样?它放在哪里,栈?堆?寄存器?(ubuntu下用gcc)
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
指针变量是存储指针的,一般在子函数中使用返回时,应该是子函数的参数也是指针,那么返回的这个指针所指空间是否释放,就看这个变量的定义范围了。
追问
那如果子函数的参数就不是指针呢,就没有参数呢?但返回的是指针
追答
那么就看你这个指针所指的空间是在哪个范围定义的了!一般主函数定义的,在主函数执行完前都会保留。子函数也是,但是随着子函数的执行结束,在子函数里定义而获得的空间也就free了。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询