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???

1、首先注意你的函数f传进去的是指针的指针。函数体中int i = 5;这个i是在函数体执行结束后,他的作用域是结束了,所以i是被释放了

但是这个时候你要注意,只是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 语言不支持在调用函数时返回局部变量的地址?

C语言指针

C 语言指针数据类型 ( 野指针 | 避免野指针推荐方案 )

在c语言中整形变量的指针能否赋值给整形变量?

c语言如何给指针参数赋值为null?

C语言中如何交换两个指针变量的的值