C语言指针 静态变量的调用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言指针 静态变量的调用相关的知识,希望对你有一定的参考价值。
#include <stdio.h>
void f(int ** q)
int i = 5;
*q = &i;
int main(void)
int *p;
f(&p);
printf("%d\n",*p);
return 0;
疑问:VC6.0输出结果:5
f函数执行完毕,为f分配的静态变量也都会释放,那么q跟i也就都不存在,为何输出结果还为5???
但是这个时候你要注意,只是i这个变量作用域结束了,但是i对应的内存区域存储的5的内存块并没有被清理。而且*q = &i这句是将5的内存块的地址赋值给了指针的指针q了,所以这个时候很q就指向了内存中存储5的这个内存块。
理解了为什么输出为5么?欢迎讨论。 参考技术A 首先你这里没有用到静态变量(没有static int i=5),而是auto的。
其次函数执行完毕静态变量不会释放,auto的才会,但是这个所谓释放只是栈指针的移动,并没有涉及到内存的malloc/free,它的地址仍然是“合法”的(在同一个线程地址空间中),虽然不那么合理。本回答被提问者采纳 参考技术B 是的i被释放了,但i原来使用的内存区域内容还没被重新使用或分配,那么里边存放的5也就还存在,p就指向了这个地址,所以打印出来就是5.
不过注意,实际软件中不要这么写,因为p指向的内存区域是已经释放了,所以引用p的行为是不可预测的! 参考技术C 楼上几位分析都有道理,但实际中千万别出现这样的代码。C语言对指针的有效性几乎没有什么检查,全靠程序员自己负责。严格说来,这样的程序是有危险的,访问了不该访问的内存。
以上是关于C语言指针 静态变量的调用的主要内容,如果未能解决你的问题,请参考以下文章
C语言基础:指针相关概念(指针的算术运算 指针数组指向指针的指针 传递指针给函数 从函数返回指针 )为啥C 语言不支持在调用函数时返回局部变量的地址?