C和汇编----存储类别、链接和内存管理

0x01 存储类别

1、作用域

一个C变量的作用域可以是块作用域、函数作用域、函数原型作用域或文件作用域。
1.1 块作用域
块是用一对花括号括起来的代码区域。比如函数体就是一个块。定义在块中的变量具有块作用域,块作用域变量的可见范围是从定义处到包含该定义的块的末尾

1.2 函数作用域
仅用于goto语句的标签。一个标签首次出现在函数的内层块中,它的作用域也延伸至整个函数

1.3 函数原型作用域
用于函数原型中的形参名,作用范围是从形参定义处到原型声明结束。这意味着,编译器在处理函数原型中的形参时只关心它的类型,而形参名通常无关紧要。

1.4文件作用域
变量的定义在函数外面,具有文件作用域,从它的定义处到该定义所在文件的末尾均可见。

2、链接

C变量有3种链接属性:外部链接、内部链接或无链接。具有块作用域、函数作用域或函数原型作用域的变量都是无链接变量。这意味着这些变量属于定义他们的块、函数或原型私有。具有文件作用域的变量可以是外部链接或内部链接。外部链接变量可以在多文件程序中使用,内部链接变量只能在一个文件中使用。当一个文件作用域变量用static修饰时就是内部链接

3、存储期

C有4种存储期:静态存储期、线程存储期、自动存储期、动态分配存储期

  • 静态存储期:在程序的执行期间一直存在,文件作用域具有静态存储期
  • 线程存储期:用于并发程序设计,程序执行可被分为多个线程。从被声明到线程结束一直存在
  • 自动存储期:块作用域的变量通常都具有自动存储期,当程序进入定义这些变量的块时,为这些变量分配内存,当退出这个块时,释放刚才为变量分配的内存
4、存储类别说明符
  • auto:表名变量是自动存储期,只能用于块作用域的变量声明中。由于在块中声明的变量本身就具有自动存储期,所以使用auto主要是为了明确表达要使用外部变量同名的局部变量的意图。
  • register 说明符也只用于块作用域的变量,它把变量归为寄存器存储类别,请求最快速度访问该变量。同时,还保护了该变量的地址不被获取。
  • static 说明符创建的对象具有静态存储期,载入程序时创建对象,当程序结束时对象消失。如果static 用于文件作用域声明,作用域受限于该文件。如果 static 用于块作用域声明,作用域则受限于该块。
  • extern 说明符表明声明的变量定义在别处。如果包含 extern 的声明具有文件作用域,则引用的变量必须具有外部链接。如果包含 extern 的声明具有块作用域,则引用的变量可能具有外部链接或内部链接,这接取决于该变量的定义式声明。
5、小结

在这里插入图片描述

0x02 存储类别和函数

函数也有存储类别,可以是外部函数(默认)或静态函数。外部函数可以被其他文件的函数访问,但是静态函数只能用于其定义所在的文件。

double gamma(double);   /* 该函数默认为外部函数 */
static double beta(int, int);
extern double delta(double, int);

在同一个程序中,其他文件中的函数可以调用gamma()和delta(),但是不能调用beta(),因为以static存储类别说明符创建的函数属于特定模块私有。这样做避免了名称冲突的问题,由于beta()受限于它所在的文件,所以在其他文件中可以使用与之同名的函数。
通常的做法是:用 extern 关键字声明定义在其他文件中的函数。这样做是为了表明当前文件中使用的函数被定义在别处。除非使用static关键字,否则一般函数声明都默认为extern。

在rand0.c文件里:

static unsigned long int next=1;
unsigned int rand0(void)
{next=next*1103515245+12345;return (unsigned int) (next / 65536 )%32768;
}

在r_drive0.c文件里

#include "stdio.h"extern unsigned int rand0(void);int main(void)
{int count;for(count = 0;count<5;count++)printf("%d\n",rand0());return 0;
}

next是静态内部链接,存储期在程序的执行期间一直存在,作用域是rand0.c文件,其他就不可以访问了。
unsigned int rand0(void)是外部函数,其他文件可以调用,用 extern 关键字声明定义rand0.c文件里

0x03 分配内存 malloc()和free()

  • malloc():接收一个参数,是所需内存的字节数,返回动态分配内存块的首字节地址。如果 malloc()分配内存失败,将返回空指针。malloc会找到合适的空闲内存块,这样的内存是匿名的,malloc()函数可用于返回指向数组的指针、指向结构的指针等,所以通常该函数的返回值会被强制转换为匹配的类型
  • free()函数的参数是之前malloc()返回的地址,该函数释放之前malloc()分配的内存,一些操作系统在程序结束时会自动释放动态分配的内存,但是有些系统不会。为保险起见,请使用free(),不要依赖操作系统来清理。
  • malloc()和free()的原型都在stdlib.h头文件中。
  • 因为char表示1字节,malloc()的返回类型通常被定义为指向char的指针。然而,从ANSI C标准开始,C使用一个新的类型:指向void的指针,把指向 void的指针赋给任意类型的指针完全不用考虑类型匹配的问题
#include "stdlib.h"
#include "stdio.h"int main(void)
{double *ptd;int max=5;int number;int i;ptd=(double *)malloc(max*sizeof(double));for(i=0;i<max;i++){ptd[i]=i;printf("%f\n",ptd[i]);}free(ptd);return 0;}

上面的程序是动态分配数组
在这里插入图片描述
反汇编:

6:        double *ptd;
7:        int max=5;
00401028 C7 45 F8 05 00 00 00 mov         dword ptr [ebp-8],5
8:        int number;
9:        int i;
10:
11:       ptd=(double *)malloc(max*sizeof(double));
0040102F 8B 45 F8             mov         eax,dword ptr [ebp-8]
00401032 C1 E0 03             shl         eax,3
00401035 50                   push        eax
00401036 E8 95 00 00 00       call        malloc (004010d0)
0040103B 83 C4 04             add         esp,4
0040103E 89 45 FC             mov         dword ptr [ebp-4],eax
12:
13:           for(i=0;i<max;i++)
00401041 C7 45 F0 00 00 00 00 mov         dword ptr [ebp-10h],0
00401048 EB 09                jmp         main+43h (00401053)
0040104A 8B 4D F0             mov         ecx,dword ptr [ebp-10h]
0040104D 83 C1 01             add         ecx,1
00401050 89 4D F0             mov         dword ptr [ebp-10h],ecx
00401053 8B 55 F0             mov         edx,dword ptr [ebp-10h]
00401056 3B 55 F8             cmp         edx,dword ptr [ebp-8]
00401059 7D 2A                jge         main+75h (00401085)
14:           {
15:               ptd[i]=i;
0040105B DB 45 F0             fild        dword ptr [ebp-10h]
0040105E 8B 45 F0             mov         eax,dword ptr [ebp-10h]
00401061 8B 4D FC             mov         ecx,dword ptr [ebp-4]
00401064 DD 1C C1             fstp        qword ptr [ecx+eax*8]
16:               printf("%f\n",ptd[i]);
00401067 8B 55 F0             mov         edx,dword ptr [ebp-10h]
0040106A 8B 45 FC             mov         eax,dword ptr [ebp-4]
0040106D 8B 4C D0 04          mov         ecx,dword ptr [eax+edx*8+4]
00401071 51                   push        ecx
00401072 8B 14 D0             mov         edx,dword ptr [eax+edx*8]
00401075 52                   push        edx
00401076 68 1C 60 42 00       push        offset string "%f" (0042601c)
0040107B E8 D0 1F 00 00       call        printf (00403050)
00401080 83 C4 0C             add         esp,0Ch
17:           }
00401083 EB C5                jmp         main+3Ah (0040104a)
18:           free(ptd);
00401085 8B 45 FC             mov         eax,dword ptr [ebp-4]
00401088 50                   push        eax
00401089 E8 C2 0A 00 00       call        free (00401b50)
0040108E 83 C4 04             add         esp,4
19:
20:

ptd=(double )malloc(maxsizeof(double));的反汇编是:

0040102F 8B 45 F8             mov         eax,dword ptr [ebp-8]
00401032 C1 E0 03             shl         eax,3
00401035 50                   push        eax
00401036 E8 95 00 00 00       call        malloc (004010d0)
0040103B 83 C4 04             add         esp,4
0040103E 89 45 FC             mov         dword ptr [ebp-4],eax

先将max的值传给eax,左移eax三位,相当于eax乘以8,就是40,刚好是传给malloc的参数值,然后压栈,调用malloc函数,再把eax存入dword ptr [ebp-4]中。
free(ptd);反汇编:

00401085 8B 45 FC             mov         eax,dword ptr [ebp-4]
00401088 50                   push        eax
00401089 E8 C2 0A 00 00       call        free (00401b50)
0040108E 83 C4 04             add         esp,4

先把dword ptr [ebp-4]的值传给eax,就是40,是malloc分配内存的大小,eax入栈,调用free函数,释放这段内存

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/380257.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器appcrash的问题怎么修复,ghost win7出现appcrash的问题怎么修复

ghost win7出现appcrash的问题怎么修复一位用户说在win7旗舰版电脑中运行程序会出现appcrash错误的提示&#xff0c;appcrash出错想必很多用户都遇到过&#xff0c;也不知道什么原因引起的&#xff0c;导致程序无法正常运行。那么有什么方法可以解决ghost系统win7运行程序出现a…

远控免杀专题9 --- Avet免杀

0x01 免杀能力一查表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

WF随笔系列之三 --- Code Activity 专题

系列目录&#xff1a;WF随笔系列之三 Out-of-the-Box Activities 专题目录 Code Activity是WF开发中使用最频繁的Activity之一&#xff0c;它要做工作的很简单&#xff0c;就是把一个或者几个Code Exec 一下&#xff0c;当此行为在执行时&#xff0c;触发一个Handlers:Execute…

A5流密码算法

0x01 A5/1流密码算法的基本用法 作用&#xff1a; 用于蜂窝式移动电话系统语言和数字加密 过程&#xff1a; A5/1算法用于用户的手机到基站之间的通信加密&#xff0c;通信内容到基站后先解密变成明文&#xff0c;然后再进行基站到基站之间&#xff0c;以及基站到用户手机之间…

远控免杀专题10--TheFatRat免杀

0x01 免杀能力一览表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

远控免杀专题11-Avoidz免杀

0x01 免杀能力一查表 几点说明&#xff1a; 1、上表中标识 √ 说明相应杀毒软件未检测出病毒&#xff0c;也就是代表了Bypass。 2、为了更好的对比效果&#xff0c;大部分测试payload均使用msf的windows/meterperter/reverse_tcp模块生成。 3、由于本机测试时只是安装了360全…

CAP与流密码

CAP 中流密码的操作 1 、Cipher 下拉菜单中选中Stream 2&#xff0c;设置LFSR 参数&#xff0c;设置好参数后点击Set Key LFSR Size&#xff1a;表示有几个寄存器 Initial key:寄存器的初始状态&#xff0c;每个寄存器初始值是0或1&#xff0c;放在一起转化成十六进制 Feedbac…

结构和其他数据形式

0x01 结构声明 结构声明&#xff08;structure declaration&#xff09;描述了一个结构的组织布局。 struct book{char title[MAXTITL];char author[MAXAUTL];float value; };该声明描述了一个由两个字符数组和一个float类型变量组成的结构。该声明并未创建实际的数据对象&am…

添加LinkServer的两句代码

sp_addlinkedserver linkserver,,SQLOLEDB,linkserver.comsp_addlinkedsrvlogin linkserver,false,null,sa,asdf第一句是添加一个名字为linkserver的链接服务器 地址是linkserver.com第二句是针对第一句添加的Linkserver添加一个访问帐号两句不能同时执行 要第一句执行成功后执…

Cobaltstrike4.0系列教程(一)----简介与安装

0x01-Cobaltstrike简介 Cobalt Strike是一款美国Red Team开发的渗透测试神器&#xff0c;常被业界人称为CS。这款神器许多大佬们都已经玩的很6&#xff0c;我一个菜鸡玩的略有心得&#xff0c;因此写一下自己的Cobaltstrike系列文章&#xff0c;希望给各位一点帮助。 最近这个…

qt 试用 (3)配置编译源代码及调试

qt 试用 &#xff08;3&#xff09;配置编译源代码及调试qt creater是一个集成ide&#xff0c;像vc一样容易使用&#xff0c;所以首先下载带qt creater的qt sdk Offline installer - 1.4 GB http://qt.nokia.com/downloads/sdk-windows-cpp-offline这里的lib没有pdb和源代码…

cobaltstrick4.0系列教程(2)---用户接口

0x01 概述 Cobalt Strike 用户接口分为两部分。接口的顶部是会话或目标的视觉化展示。接口的底部展示了每个你与之交互的 Cobalt Strike 功能或会话的标签页。你可以点击这两部分之间的区域、按你的喜好重新调整这两个区域的大小。 0x02 工具条 Cobalt Strike 顶部的工具条…

cobalt strick 4.0系列教程(3)---数据管理

0x01 概述 Cobalt Strike 的团队服务器是行动期间 Cobalt Strike 收集的所有信息的中间商。Cobalt Strike 解析来自它的 Beacon payload 的输出&#xff0c;提取出目标、服务和凭据。 如果你想导出 Cobalt Strike 的数据&#xff0c;通过 Reporting → Export Data 。Cobalt S…

calayer 与uiview

研究Core Animation已经有段时间了&#xff0c;关于Core Animation&#xff0c;网上没什么好的介绍。苹果网站上有篇专门的总结性介绍&#xff0c;但是似乎原理性的东西不多&#xff0c;看得人云山雾罩&#xff0c;感觉&#xff0c;写那篇东西的人&#xff0c;其实是假 设读的人…

代换-置换网络(SP网络)

0x01 概述 代换-置换网络是一系列被应用于分组密码中相关的数学运算&#xff0c;高级加密标准&#xff08;英语&#xff1a;AES&#xff09;、3-Way、Kuznyechik、PRESENT、SAFER、SHARK、Square都有涉用。这种加密网络使用明文块和密钥块作为输入&#xff0c;并通过交错的若干…

【贪心】最小生成树Kruskal算法Python实现

文章目录 [toc]问题描述最小生成树的性质证明 Kruskal算法时间复杂性Python实现 个人主页&#xff1a;丷从心 系列专栏&#xff1a;贪心算法 问题描述 设 G ( V , E ) G (V , E) G(V,E)是无向连通带权图&#xff0c; E E E中每条边 ( v , w ) (v , w) (v,w)的权为 c [ v ] …

HTML5 学习笔记

HTML5 学习笔记 前言 该学习笔记的相关学习视频&#xff1a;【狂神说Java】HTML5完整教学通俗易懂 目前笔记只有简单的例子和框架&#xff0c;将来在实践中会进一步学习和补充内容 目录HTML5 学习笔记前言网页基本信息网页基本标签标题标签段落标签换行标签水平线标签字体样式…

保护机制

0x01 概述 操作系统提供了许多安全机制来尝试降低或阻止缓冲区溢出攻击带来的安全风险&#xff0c;包括DEP、ASLR等。在编写漏洞利用代码的时候&#xff0c;需要特别注意目标进程是否开启了DEP&#xff08;Linux下对应NX&#xff09;、ASLR&#xff08;Linux下对应PIE&#xf…

机器学习降维算法一:PCA(主成分分析算法)

引言&#xff1a; 机器学习领域中所谓的降维就是指采用某种映射方法&#xff0c;将原高维空间中的数据点映射到低维度的空间中。降维的本质是学习一个映射函数 f : x->y&#xff0c;其中x是原始数据点的表达&#xff0c;目前最多使用向量表达形式。 y是数据点映射后的低维向…

VS 2005模板丢失找回的办法

安装其他插件的时候&#xff0c;常常模板丢失&#xff0c;比较郁闷&#xff0c;以前就用土办法&#xff0c;重装VS来解决这个问题&#xff0c;这次终于弄清楚怎么回事了&#xff0c;可以采取下面两个步骤解决1。复制ProjectTemplates和ItemTemplates&#xff0c;保证VS能找到相…