链接属性
(1)大家知道程序从源代码到最终可执行程序,经历的过程:编译、链接。
(2)编译阶段就是把源代码搞成.o目标文件,目标文件里面有很多符号和代码段、数据段、bss段等分段。符号就是编程中的变量名、函数名等。运行时变量名、函数名能够和相应的内存对应起来,靠符号来做链接的。
(3).o的目标文件链接生成最终可执行程序的时候,其实就是把符号和相对应的段给链接起来。
C语言中的符号有三种链接属性:外连接属性、内链接属性、无连接属性。
 

一.c程序的内存映像:

整个4G的内存分配。

1.代码段&只读数据段:
代码段:是存放整个代码(函数)。只读数据段:在程序运行的时候只能读数据,不能改数据比如const 关键字修饰的变量。
2.数据段和bss段:
数据段:初始化非零的全局变量和static修饰定义的非零的局部变量。
bss段:未被初始化的全局变量和static修饰未被初始化的变量。
3.文件映射区:
当一个进程打开文件时,就直接在内存中改变文件内容,就是把硬盘里的文件复制了一份在内存中,修改完成后保存后就将内存中写到硬盘里去。
4.堆:用mocall申请内存。free释放内存。如果没有释放,内存就泄露了,是程序员手工操作的。
5.栈:局部变量,随取随用。函数的调用也涉及到栈。
6.内核映射区:将操作系统的内核程序映射到该区域了。
二.关键字:
1.auto:跟局部变量的使用没有区别。加不加无所谓。
2.static:两种用法:这两种用法完全不同。很有迷惑性。。。。重要。
    (1)修饰局部变量,形成静态的局部变量,他的内存分配在 数据段/bss,此时对比局部变量,他的内存分布在栈上。(存储        类不同就衍生出许多不同)这就和局部变量上有了本质差别。(作用域、链接属性、生命周期)作用域都是代码块   {  }
    (2)修饰全局变量,形成静态的全局变量,静态全局变量和全局变量有什么区别。他们的区别就在链接属性上了。
        静态局部变量存储类和全局变量相同,作用域是代码段。而全局变量是整个文件。
        静态局部变量连接属性是无连接。全局变量是外连接。

3.extern:

 声明作用。 在a.C中的定义的全局变量,想要在b.C中用。就要用extern声明该全局变量。不然就会没定义。
4.volatile:
易变的。有时候在程序中(isr中断服务程序、共线程、硬件自动置位)会改变某个变量的值。但是编译器会帮我们优化程序。比如
a=1;
b=a;
c=b;   //编译器会帮你优化成    c=b=a=1;      
不会逐一去赋值,cpu执行效率高了。但是编译器并不知道,他是没有这个意识的,所以要加volatile 关键字。编译器就会知道不去优化。如果是下面的这样代码,就会出错。
do
{
*p=1;
}
while(*p)       //*p的值有可能会被改,但是如果没加volatile关键字的时候,编译器就会将其优化成while(1)死循环。
但是加了volatile关键字时,编译器就不会将其优化成while(1),而是写成这样 while(*p)
5.restrict:只用来修饰指针。如果加了restrict关键字,该指针指向的内存空间只能由该指针修改别的指针无法修改。
二、作用域
局部变量:
全局变量:
重名变量的掩蔽规则:
三、生命周期:
栈上的分配的变量:函数每调用一次都会创建一次,然后使用,最后在函数返回的时候消亡。
堆上分配的变量:malloc申请时诞生,然后使用,直到free是消亡。

代码段&rodata段:

链接属性:程序的生成过程:编译加链接。编译是为了将函数/变量等.O二进制机器码文件,链接是为了把第各个独立的二进制的.o链接形成一个可执行程序。
编译是以.c文件为单位,链接是以工程为单位,
(1)
(2)
三种链接属性:
外链接,内连接,无连接。
(1)外链接外部链接属性,再整个程序范围内(可以跨文件)进行链接,比如普通的全局变量和函数。
(2)内连接:static修饰的全局变量的函数。在本文件中。
(3)无连接:所有的局部变量。
函数和全局变量重名问题:C语言就是用三种链接属性来解决重名
我们将明显不会在其他C文件中应用(只在当前文件中应用)的函数/全部变量,加static变为内连接。
static 修饰的全局变量和全局变量的区别:将全局变量的外链接改为内连接。注意和static  修饰局部变量 改变的是存储类。
如果在某个.c文件中写程序时
 
最后总结:将学习的内容总结:要学会总结,自己每次学完后要学会写总结:这样才会更好的学习新知识。---谨记---

存储类&作用域&生命周期&链接属性的更多相关文章

  1. 7、存储类 & 作用域 & 生命周期 & 链接属性

    概念解析 存储类 存储类就是存储类型,也就是描述C语言变量在何种地方存储. 内存有多种管理方法:栈.堆.数据段.bss段..text段······一个变量的存储类属性就是描述这个变量存储在何种内存段中 ...

  2. C语言-存储类&作用域&生命周期&链接属性

    1.概念解析(1)存储类 a.存储类就是存储类型,也就是描述C语言变量在何种地方存储. b.内存有多种管理办法:栈.堆.数据段.bss段..text段......一个变量的存储类属性就是描述这个变量存 ...

  3. JVM-类加载过程(Java类的生命周期)

    什么是类加载 类的加载指的是将类的.class文件中的二进制数据读入到内存中,将其放在运行时数据区的方法区内,然后在堆区创建一个java.lang.Class对象,用来封装类在方法区内的数据结构.类的 ...

  4. <JVM中篇:字节码与类的加载篇>03-类的加载过程(类的生命周期)详解

    笔记来源:尚硅谷JVM全套教程,百万播放,全网巅峰(宋红康详解java虚拟机) 同步更新:https://gitee.com/vectorx/NOTE_JVM https://codechina.cs ...

  5. JVM 类的生命周期、类加载器

    类的加载.连接与初始化                  • 1. 加载:查找并加载类的二进制数据         • 2. 连接             – 2.1 验证:确保被加载的类的正确性   ...

  6. 乐字节Java反射之三:方法、数组、类加载器和类的生命周期

    本文承接上一篇:乐字节Java发射之二:实例化对象.接口与父类.修饰符和属性 继续讲述Java反射之三:方法.数组.类加载器 一.方法 获取所有方法(包括父类或接口),使用Method即可. publ ...

  7. iOS对UIViewController生命周期和属性方法的解析

    目录[-] iOS对UIViewController生命周期和属性方法的解析 一.引言 二.UIViewController的生命周期 三.从storyBoard加载UIViewController实 ...

  8. [Java]类的生命周期(下)类的初始化[转]

    上接深入java虚拟机——深入java虚拟机(二)——类加载器详解(上),在上一篇文章中,我们讲解了类的生命周期的加载和连接,这一篇我们接着上面往下看. 类的初始化:在类的生命周期执行完加载和连接之后 ...

  9. [Java]类的生命周期(上)类的加载和连接[转]

    本文来自:曹胜欢博客专栏.转载请注明出处:http://blog.csdn.net/csh624366188 类加载器,顾名思义,类加载器(class loader)用来加载 Java 类到 Java ...

随机推荐

  1. EasyUI 使用tabs切换后datagrid显示不了内容

    今天刚遇到这个问题,找了下各群的深度合作伙伴,没有好的答案,那就自己研究吧. 问题点在于打开tab1时,快速切到tab2,这时tab1的datagrid渲染未完成,再次回到tab1,因为是在不可见区域 ...

  2. [TCP/IP] 网络层-简单查看路由表

    使用抓包工具排除网络故障:1.如果一台计算机在网络上发广播包,广播的mac地址是全ff,就有可能堵塞2.使用抓包工具,检测广播包和多播包 网络畅通的条件:数据包有去有回1.路由器使用路由表找到目标网段 ...

  3. element表格添加查看操作

    表格代码:黄色部分关键代码 首先看效果: <el-table :data="tableData" border height="480" style=&q ...

  4. Android Interpolator解析

    本文部分图片转自:https://blog.csdn.net/lgaojiantong/article/details/39451243 目录 自定义插值器 系统插值器 1. 自定义插值器 要自定义插 ...

  5. 【English】四、Y结尾名词变复数

    一.辅音字母+y结尾的名词,将y改变为i,再加-es. 读音变化:加读[z]. 例: candy→candies; daisy→daisies; fairy→fairies; lady→ladies; ...

  6. C学习笔记(逗号表达式)

    (1)书写: ① int i; i=(i=*,i*); printf("%d\n",i); i=60; ② int i; i=i=*,i*; printf("%d\n&q ...

  7. js坚持不懈之18:trim()方法

    trim()方法,类似Python中的strip(),用去去除字符串对象前后的空格. <!DOCTYPE html> <html> <body> <scrip ...

  8. 初步了解PE分析

    尝试编写代码获取PE文件的信息. 首先使用 CreateFile打开一个PE文件并返回一个用于访问该对象的handle. HANDLE CreateFile( LPCTSTR lpFileName, ...

  9. matlab导入txt数据画图

    因为最近需要观察txt保存的一堆数据,则需要使用这些数据画图.强大的matlab分分钟解决了. 实例数据:data.txt 步骤: ①打开matlab -> HOME(主页) -> Imp ...

  10. SQL 查询中case的运用

    适用场景: 需要根据现有字段经过一定条件得到新的查询字段相关语法: CASE WHEN 条件1 TEHN 结果1 WHEN 条件2 THEN 结果2 ...... ELSE 结果N END 练习代码: ...