(十一)C语言静态内存分配

来源:互联网 发布:深入浅出rails 知乎 编辑:程序博客网 时间:2024/04/28 04:58


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
  可以看出来,内存中的值已经被回收了。


0 0