美文网首页
存储类别和内存管理

存储类别和内存管理

作者: 氮化镓加砷 | 来源:发表于2018-01-31 18:30 被阅读9次

概念

作用域:块作用域,函数作用域,文件作用域

链接:

外部链接:多文件中使用
内部链接:只在一个翻译单元(文件)内使用
无链接 :具有块,

函数,函数原型作用域的变量

存储期:静态作用域和非静态作用域

屏幕快照 2018-01-31 下午3.59.43.png

自动变量:

1.自动储存期,
2.块作用域,
3.无链接
4.auto关键字(显式)

void doSome(){
    int d = 3;
};
int main(int argc, const char * argv[]) {
    int a = 0;
    for (int i = 0 ;  i < 10 ; i++) {
        int b = 1;
    }
    {
       auto int c = 2;
    }
    return 0;
}
// a,b,c,d都是自动变量

静态内部链接:

1.static显式声明,
2.静态储存期,
3.内部链接,
4.文件作用域.

static int statc_a = 2; //只能在main.c中访问
int main(int argc, const char * argv[]) {
    printf("%d",statc_a);
    return 0;
}

静态外部链接:

1.静态储存期,
2.外部链接,
3.文件作用域.

/* sub.h */
#include "sub.h"
int sub_a = 2;

/* main.c */

#include <stdio.h>

int main(int argc, const char * argv[]) {
    extern int sub_a;
    printf("sub_a : %d\n",sub_a);
    return 0;
}
/*
sub_a : 2
Program ended with exit code: 0
*/
//编译器会找到sub_a这个变量的。

这样使用静态外部链接的存储类别变量是有问题的,如果全局的变量名有重复的就会报错,比如在main.c中又定义了一个相同名字的sub_a ,编译无法通过,显示链接错误。

#include <stdio.h>

int sub_a = 2;

int main(int argc, const char * argv[]) {
    extern int sub_a;
    printf("sub_a : %d\n",sub_a);
    return 0;
}
//clang: error: linker command failed with exit code 1 (use -v to see invocation)

一个比较规范办法是使用头文件,在头文件中申明需要外部使用的变量extern

/* .h */
#include <stdio.h>
extern int sub_a;
#endif /* sub_h */

/* main.c */
#include <stdio.h>
#include "sub.h"

int main(int argc, const char * argv[]) {
    printf("sub_a : %d\n",sub_a);
    int sub_a = 3;
    printf("sub_a : %d\n",sub_a);
    return 0;
}
//但是依然并不能完全解决我们上面产生的问题。

静态无链接

1.静态储存期,
2.无连接,
3.块作用域

PS:静态变量只能初始化一次,并且定义时候必须赋值。

static:在声明局部变量时,使用关键字 static 将局部变量指定为“静态局部变量”,这样在函数调用结束后不消失而保留原值,即占用的存储单元不释放,在下一次函数调用时,该变量已有值就是上次函数调用结束时的值。

static的作用?

1.在块作用域内将变量的存储期变成静态

void add(){
    static int static_a = 1;
    int a = 1;
    printf("static_a:%d---a:%d\n",static_a,a);
    static_a++;
    a++;
}
//调用三次
static_a:1---a:1
static_a:2---a:1
static_a:3---a:1

2,将文件作用域内的变量从外部链接变成内部链接

/* sub.c */
#include "sub.h"

static int static_sub_a = 3;
int sub_a = 2;

/* main.c */
int main(int argc, const char * argv[]) {
    
    extern int sub_a;
    extern int static_sub_a;
    
    printf("%d\n",static_sub_a);
    printf("%d\n",sub_a);
    return 0;
}
//报错   "_static_sub_a", referenced from: 外部无法访问static_sub_a


相关文章

  • 存储类别和内存管理

    概念 作用域:块作用域,函数作用域,文件作用域 链接: 外部链接:多文件中使用内部链接:只在一个翻译单元(文件)内...

  • C中的内存管理

    存储类别、链接和内存管理 关键字:auto 、extern 、static 、register 、const、vo...

  • 第12章:存储类别、链接和内存管理

    #1. 存储类别1.1 作用域1.2 链接1.3 存储期1.4 自动变量1.5 寄存器变量1.6 块作用域的静态变...

  • C 内存管理

    1、存储类别 C 语言提供了多个不同的存储类别在内存中存储数据。要理解这些存储类别,我们先来理解一些概念。 1.1...

  • C primer Plus study note chapter

    存储类别:C中提供了许多不同的模型或者存储类别在内存中存储数据。从硬件方面看:被存储的值都占用了一定的物理内存,C...

  • OC基础(六)——内存管理

    内存管理概述 内存管理内存的作用:存储数据. 如何将数据存储到内存之中.声明1个变量.然后将数据存储进去. 当数据...

  • 操作系统实验2:分页式存储管理

    实验目的 实现分页式存储管理内存分配和地址转换过程。进一步实现请求分页式存储管理过程,包括内存和置换空间管理、地址...

  • C++中管理数据内存的方式

    导语 根据用于分配内存的方法,C++有3种管理数据内存的方式:自动存储、静态存储和动态存储(也叫自由存储或堆存储)...

  • 操作系统总览

    操作系统的 操作系统的用户界面 进程管理 处理机调度 存储管理 进程和存储管理示例 windows进程和内存管理 ...

  • 操作系统(三)内存管理 3.2 虚拟内存管理

    3.2 虚拟内存管理 3.2.1 虚拟内存的基本概念 3.2.1.1 传统存储管理方式的特征 传统存储管理很多暂时...

网友评论

      本文标题:存储类别和内存管理

      本文链接:https://www.haomeiwen.com/subject/dkqlzxtx.html