當前位置:首頁 » 存儲配置 » 存儲fun

存儲fun

發布時間: 2023-01-19 11:57:20

⑴ 函數調用時,實參存儲在哪個函數的棧幀中

程序中,一個函數是一個過程,這個過程可以分為包括傳入參數、過程代碼、返回三部分構成。由於一個函數過程需要用到內部變數、臨時變數等,所以需要在進程空間的棧空間分配一段存儲片段來存儲函數過程中的這些參數,該內存片段即為棧幀。
棧幀的由來:
為一個函數的過程提供一個存儲函數局部變數,參數,返回地址和其他臨時變數;
棧幀的結構:

圖片來源(現代編譯原理)

棧幀的周期:
進入函數~函數返回,該階段內棧幀作為
不同的語言具體的實現方式略有不同,但是,總體上,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語言能以簡易的方式編譯、處理低級存儲器。

熱點內容
34在c語言中 發布:2025-07-20 03:41:32 瀏覽:657
如何不用密碼登出appleid 發布:2025-07-20 03:40:13 瀏覽:935
Xp怎麼查看登錄密碼 發布:2025-07-20 03:27:22 瀏覽:548
568電腦伺服器是什麼 發布:2025-07-20 03:22:08 瀏覽:771
java從資料庫讀取時間 發布:2025-07-20 03:12:53 瀏覽:559
如何申請驗證賬號和密碼 發布:2025-07-20 03:10:16 瀏覽:854
密碼怎麼治 發布:2025-07-20 03:08:01 瀏覽:633
怎麼取消windows10密碼登陸 發布:2025-07-20 02:58:41 瀏覽:946
絕地求生裡面的伺服器怎麼修改 發布:2025-07-20 02:57:13 瀏覽:4
編譯局副局長 發布:2025-07-20 02:57:13 瀏覽:174