C 语言 局部变量引用
所谓静态内存分配,就是值我们并没有鲜明的指明内存分配,普通的变量的声明啦什么的,都需要内存,但是都是由系统自动分配的,所以叫静态内存分配。
关键点: 函数内部的局部变量,在函数运行完销毁,之前指向它的指针变得不确定
例如一段程序:
include <stdio.h>
void swipe(int** p){
int temp = 999;
*p = &temp;
}
void main(){
int i = 100;
int p = &i;
swipe(&p);
printf("p的:%d\n",p);
printf("p的:%d\n",p);
printf("p的:%d\n",*p);
}
运行结果:
*p的:999
*p的:0
*p的:0
可以看出,我们的值已经交换成功了,但是为什么继续打印的时候就变成了0?
那是因为这个时候 temp 这个变量的内存地址被回收了。所以指针main方法中的指针变量p所存储的内存地址中的值,已经不是当初赋值的999了,已经不知道被谁征用了。
这就是所谓的静态内存分配,也就是内存的分配与回收都是由系统自动操作的。而在方法里面定义的变量,生命周期只在方法里面,所以temp变量的值只在swipe方法里面生效。方法运行完就该回收了。那么为什么我们会在方法运行完,第一条打印语句的时候,值还存在,不是被回收了吗?这个可以叫做内存残影吧,也就是说方法运行完里面的变量内存会被回收,但也是需要时间的,所以,第一条语句打印出来,只是刚好赶上了这个值没有被回收而已,不行,我们让程序延迟一下,看看第一条语句还能打印出来吗?
include <stdio.h>
include<stdlib.h>
void swipe(int** p){
int temp = 999;
*p = &temp;
}
void main(){
int i = 100;
int p = &i;
swipe(&p);
Sleep(10);
printf("p的:%d\n",p);
printf("p的:%d\n",p);
printf("p的:%d\n",*p);
}
我们让程序延迟个10毫秒看结果:
*p的:0
*p的:0
*p的:0
可以看出来,内存中的值已经被回收了。