C语言中的储存类别,链接和内存管理

这是本人关于 C Primer Plus 这本C语言经典著作 第12章的一个总结 如有不对 欢迎指出

int   a  =     3; 

这个东西创建了一个 叫做 a 的标识符   , 从硬件上来看 就是 有一个叫a的标识符占用了一定物理内存  

标识符有两个性质  一个叫    作用域(scope)   还有一个叫  链接(linkage)

一作用域

  

         ①块作用域

         ②文件作用域

         ③函数原型作用域   (还有一个叫函数作用域不用管他)

①块作用域           

int MAX (int a , int b, int c){        我们可以看到在这个函数里面创建了一个叫t的变量 他只在 这个叫MAX的函数里面起作用  这就叫块作用域(在主函数里面的也是的)
    int t;
 
     if (a>b)
         t=a;
     else
         t=b;
     if (c>t)
         t=c;
     printf ( "%d\n" ,t);
     return  0;
}
②文件作用域
#include<stdio.h>;
int a = 0;            这里我们看到 a 的是定义在所有函数外面的,他可以直接在任何函数,包括主函数中直接使用 这叫 文件作用域;
int main(void)
{
~~~~
}
 
③函数原型作用域
#include<stdio.h>
int main(void)
{
~~~
}
int MAX(~~~)        这就叫函数原型作用域  , 不知道怎么解释 自己脑补吧,,,,
 
 

二 连接器

①无链接

函数原型作用域的变量 都是无连接的,就是说函数的无连接变量都是属于函数本身的;

②内部链接     

③外部连接

内部链接和外部链接的区别就是 看定义变量的时候 加没加 static;

三 储存期

据说分为 四种储存期   静态储存期  线程储存期(这个我不懂不管)  自动储存期  动态分配储存期

静态和自动

#include <stdio.h>

void fn(void)            相信可以看出区别了吧?

{                 n是自动储存期 也就是当 fn这个函数运行结束后他就会被释放,而 m他因为外部链接 static 让他变成 能够静态储存期,也就是当程序结束才会释放内存

int n = 10;

printf("n=%d\n", n);
n++;
printf("n++=%d\n", n);
}

void fm_static(void)
{
static int m = 10;

printf("static m=%d\n", m);
m++;
printf("m++=%d\n", nm;
}

int main(void)
{
fn();

fm_static();

fn();

fm_static();

return 0;
}

这里是运行结果

n=10 n++=11 -------------------- static m=10 m++=11 -------------------- n=10 n++=11 -------------------- static m=11 m++=12

动态分配储存期

int *a;

a = (int*)malloc(30 * sizeof(int))   意思是说 a是一个整型指针  然后给这个指针分布了 30个 int 大小的 内存  换句话说  相当于 int a[30];

free(a);            意思就是说释放a;

                动态分配储存期的意思就是说 自己决定这个变量活多久;

最后讲一下 const 和  define

#const  A10    const A 认为A是常量;

#define  B 10    这个认为B是变量,只不过这个变量是不可改变的;

猜你喜欢

转载自www.cnblogs.com/Bruce-Xie/p/11223549.html