從堆疊到引數傳遞

2021-07-11 05:32:33 字數 1345 閱讀 5022

剛接觸c語言的同學會遇到很多麻煩的問題,變數作用域和引數傳遞就是這眾多問題中的乙個,下面我們就來**關於引數傳遞以及變數和引數在系統記憶體堆疊中的分配。

首先說引數傳遞對於如下**

#include #include void blogtest(int* number1,int* number2);

int main()

void blogtest(int* number1,int* number2)

在初學c語言剛接觸指標的時候,老師說有時候返回值多於乙個的時候,return只能返回乙個資料值,要在c中返回多個值的時候就要用到指標(c語言不支援按引用傳遞),所以我就寫出了上述**,明白的人已經一眼就看出來問題所在了---->解引用的時候野指標導致的非法記憶體引用,我們現在從頭開始分析一下這段**。

首先這段**的原意是向clogtest傳遞兩個int* 型的指標,並改變指標所指的值。但是錯就錯在在main函式裡面只是定義了兩個指向int型資料的指標,這是只會在棧中分配兩個記憶體區存放兩個指標的位址而已,並沒有存放真正int資料的地方,所以你在將位址傳下去的時候就會出現*number1,*number2的時候執行時錯誤,因為這兩個指標指向的位址是非法的,你沒給分配的。

所以正確的做法是先分配記憶體再解引用。如下**片:

#include #include void blogtest(int* number1,int* number2);

int main()

void blogtest(int* number1,int* number2)

這個時候就涉及到了堆疊的問題(這個棧是用資料結構中的棧形式來實現的)。

**在記憶體中被分出了三個區域--->堆區、棧區、**區。

**區就是存放你**的地方,**被轉換為二進位制檔案儲存在**區。

堆區就是c/c++中malloc/new出來的記憶體區。

棧區就是隨著你的程式的編譯,不斷分配銷毀、分配銷毀的記憶體區,遵循先進後出的規則。

所以我在棧區建立了兩個指標,但是沒在堆區為這兩個指標分配所對應的位址,這個做法是錯誤的,但是在編譯期又無法檢測到這種捉急的問題,

u boot到kernel的引數傳遞

在u boot 的最後提到傳遞引數給核心,呼叫如下 呼叫核心,暫存器 r0 0,r1 機器型別,r2 引數塊位址 thekernel 0,bd bi arch number,bd bi boot params 而這兩個引數是如何傳遞給 kernel 的分析如下 只涉及到非彙編部分 一 u boot ...

組合語言 6 利用堆疊傳遞引數及堆疊的修正

一 呼叫子程式時資訊的保護與恢復方法 1 在子程式中進行 subroute proc push axpush bxpush cx.popcx popbx popax retsubroute endp 2 在主程式中進行 push axpush bxpush cxcall subroute popcx...

彙編中引數的傳遞和堆疊修正2

在經典的組合語言教程中,函式呼叫時堆疊的使用都是著重講解的問題。如今隨著高階語言的越來越完善,單純使用彙編開發的程式已經不多了。但對函式呼叫時堆疊動向的了解仍有助於我們明晰程式的執行流程,從而在程式編寫和除錯的過程中有乙個清晰的思路。一 呼叫約定 在win32中,有關函式的呼叫主要有兩種約定。1 s...