存储fun
⑴ 函数调用时,实参存储在哪个函数的栈帧中
程序中,一个函数是一个过程,这个过程可以分为包括传入参数、过程代码、返回三部分构成。由于一个函数过程需要用到内部变量、临时变量等,所以需要在进程空间的栈空间分配一段存储片段来存储函数过程中的这些参数,该内存片段即为栈帧。
栈帧的由来:
为一个函数的过程提供一个存储函数局部变量,参数,返回地址和其他临时变量;
栈帧的结构:
图片来源(现代编译原理)
栈帧的周期:
进入函数~函数返回,该阶段内栈帧作为
不同的语言具体的实现方式略有不同,但是,总体上,fun(a,b);
局部变量:
包括函数传入的形参和函数内部定义的变量;
返回地址:
指令指针P指向call fun,那么fun栈帧存储的返回地址为P+1;现今的编译器的一个约定是将返回地址存到一个固定的寄存器中,这样比读取栈帧(内存)效率要高。
临时变量:
主要为计算,运算过程中的中间临时变量;
参数传递:
其一:如果fun中调用另一个函数k(a,b...n);那么,传递的参数是形参,按照现代编译规定,前k个形参是通过寄存器传递,后n-k个形参通过栈帧的实参部分(栈帧的尾部)来传递;
其二:主要为在fun中要调用函数g(&a,&b),那么为g()函数传出实参(形参是通过寄存器来传递的)是通过“传出实参”区块进行的,这么做主要是为了保证该实参能够被内层嵌套的函数访问。比如,g函数由调用一个k(a地址)函数,同样需要用到a的地址,所以fun在传递参数时必须为实参(&a)传递申请固定的内存存储空间(而非用寄存器)这样k函数可以通过固定的内存地址(fun的形参列表来获取参数值)。这时的g的栈帧为fun栈帧的下一帧(相邻的空间地址),即调用者和被调用者的栈帧是相连的;
保护的寄存器:
栈帧作为函数过程的一个临时内存存储区块,同时负责函数调用过程中寄存器值的保存和还原。即:假设fun函数目前占用了寄存器Ri存储一个临时变量t,而此时调用了函数g(),在g()函数中可能需要用到寄存器Ri做运算的临时存储,那么如何确保g()函数调用返回后,Ri恢复到fun中t的原来值。这就需要在调用者或者被调用者中选择其一来保存原有Ri的值,即caller-save或者callee-save。
最后一个问题:进程空间中栈帧的体现是什么?
进程的栈空间 & 栈帧的增长:
调用函数和被调用函数间的栈帧是相邻的,即如果进程进入一个递归函数f(),递归k层。那么在第k层嵌套时,进程的的栈空间已产生出新的k个连续的f()函数的栈帧,当然每个栈帧的内存储的变量值是因函数过程而定的。
⑵ 静态存储区
3个a不会冲突。
这里涉及几个方面的知识:
1. 全局变量和静态数据放在静态存储区,生命周期为从申请到程序退出。因此局部变量若定义为static,则存储在静态存储区,否则存储在函数的栈内,生命周期为本函数内。
2. 全局变量和局部变量的作用域,全局变量为从申请到整个程序结束,局部变量为从申请到本{}范围内。
3. 局部变量对全局变量的屏蔽。若在本函数内定义的变量与全局变量同名,则将全局变量屏蔽,使用时为内部定义的局部变量。
4. 定义为static类型的局部变量,再次进入该函数,可以使用保留的结果。
下面的程序可以帮助理解:
#include<stdio.h>
int a = 1;
void fun()
{
static int a =3;
int b = 1;
printf("%d, %d\n", a, b);
a++;
b++;
}
int main()
{
printf("%d\n", a); /* global a */
static int a = 2;
printf("%d\n", a); /* static a in main */
fun(); /* static a in fun */
fun(); /* static a in fun */
return 0;
}
运行结果为:
1 /* 全局变量a */
2 /* 因为定义了main内的局部变量static int a,全局变量a被屏蔽,打印的为main局部变量a */
3, 1 /* 因为定义了fun内的局部变量static int a,全局变量a被屏蔽,打印的为fun内的局部变量a。 b是局部变量,打印为1 */
4, 1 /* 因为static的生命周期为整个程序,再次进入fun是a的值可以被保留,再次调用打印的值编程了3+1=4。b因为是在栈内,函数退出后空间被释放,再次进入是重新申请的空间,结果仍为新初始化的值1 */
⑶ 关于函数返回值的存储问题
fun里的a存储在调用fun函数时开辟的栈空间里,这块栈只在调用fun时对fun可用,调用结束后返回的a,其实是暂存在寄存器里的(一般情况下是eax),而返回到main里时,main又会把返回的值拷贝到自己所有的栈空间里(在这里是以临时变量的形式)。所以不管是fun还是main,任何非static、register变量和常量的存储都是在函数的局部存储区里(也就是对当前调用函数可见的栈空间)。main也是一个函数。
1、调用完就收回;
2、不是,栈是一段公共内存,函数的代码也不是存在栈里的,只是从栈上给新调用的函数分配一段栈空间,用来保存这个函数执行期间用到的局部变量;
3、函数的返回是被保存在寄存器里的(这个返回指的是return,不包括通过参数返回或者全局变量),栈空间由程序自动维护,函数退出以后栈的内容其实不会更改,只是栈指针复位,所以函数内部的局部变量声明了如果不赋值,它的值就是随机的也就是这个道理。
⑷ 文件名为fun是什么格式的文件
一种新的病毒.由autorun.***文件驱动运行·和以前的autorun病毒一样,不过更加厉害,中毒后不能用右键打开硬盘,它里面有很多的autorun.***文件。
手动清除
1打开我的电脑---点搜索---搜索文件夹名(是文件夹,不是能其它)---搜索到文件夹后双击打开文件夹---点向上---点工具把隐藏文件都显示出来---然后手动删除以autorun打头的文件永久删除.这样把所有硬盘里的都删除.重启电脑,就能双击打开硬盘了.(不推荐)
2这个病毒可以给自己开端口,有自己的并发进程监控,结束掉dc\sviq\fun\other\win.exe进程后,会自动加载.在所有文件夹中建立和文件名相同的exe文件.造成机器速度慢,网络端口占用\自动加载注册表,现有的瑞新之类软件无法识别,只好自家动手。
这个木马很难清,通过u盘传播.
原先用过一个批处理可以试试:
@echo on
taskkill /im explorer.exe /f
taskkill /im wscript.exe
taskkill /im sviq.exe
taskkill /im fun.exe
taskkill /im dc.exe
taskkill /im other.exe
taskkill /im winsit.exe
taskkill /im win.exe
start reg add HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\EXplorer\Advanced /v ShowSuperHidden /t REG_DWORD /d 1 /f
start reg import kill.reg
del c:\windows\sviq.exe /f /q /as
del c:\windows\dc.exe /f /q /as
del c:\windows\system\fun.exe /f /q /as
del c:\windows\inf\other.exe /f /q /as
del c:\windows\help\other.exe /f /q /as
del c:\windows\system32\winsit.exe /f /q /as
del c:\windows\system32\config\win.exe /f /q /as
del c:\autorun.* /f /q /as
del %SYSTEMROOT%\system32\autorun.* /f /q /as
del d:\autorun.* /f /q /as
del e:\autorun.* /f /q /as
del f:\autorun.* /f /q /as
del g:\autorun.* /f /q /as
del h:\autorun.* /f /q /as
del i:\autorun.* /f /q /as
del j:\autorun.* /f /q /as
del k:\autorun.* /f /q /as
del l:\autorun.* /f /q /as
start explorer.exe
其他方法
效果不大\最后还是使用arswp清除可以去掉文件夹中exe,由于变种更新非常快;强烈建议有移动存储的人采取以下措施:
1.格式化移动存储。
2.在U盘或移动存储根目录中新建文件夹,命名为autorun。
3.使用前先扫描移动存储。
⑸ 宏基蜂鸟fun能装机械硬盘吗
能。宏碁蜂鸟funpluss50这款笔记本作为办公本来说还是不错的,其可以加机械硬盘,都固态和机械硬盘的进行组合,所以宏基蜂鸟fun能装机械硬盘。机械硬盘是计算机存储设备的一种,主要用来存储数据资料。机械硬盘因内置电机而得名,是由控制电机、旋转轴、盘片、读写磁头、以及相关接口控制电路组成的数据存储设备。
⑹ 请编一个函数fun,其中n所指存储单元中存放了数组中元素的个数。函数的功能是:删除所有值为y的元素。已在
int fun(int bb[],int n, int y)
{
int k;
for(k=0;k<n; k++)
{
if(bb[k]==y)
{
for(int j=k;j<n-1;j++)
{
bb[j]=bb[j+1];
}
n--;
k--;
}
}
return n;
}
⑺ c语言中fun(a,0,3)是什么意思
调用。c语言中fun(a,0,3)函数是自定义函数,意思是调用,用这个单词表示调用后面的函数。C语言是一门面向过程、抽象化的通用程序设计语言,广泛应用于底层开发,C语言能以简易的方式编译、处理低级存储器。