從陣列傳參看函式的呼叫和陣列的儲存情況

2021-06-28 15:37:22 字數 1312 閱讀 8386

首先我們先上例程:

#include #define size 10

/* 陣列為 int 型別的陣列*/

const int date[size] = ;

int sum(unsigned char *ar);

void main( void )

/* 形參為 unsigned char 型別

*/int sum(unsigned char *ar)

{ int i;

int total = 0;

/* 先列印出 ar 的位址*/

for(i=0; i執行結果為:

本應輸出的結果應為:0+1+···+9 = 45

而實際輸出的結果卻為3,這是為什麼呢,讓我們先看看函式呼叫的過程。

函式呼叫過程:

呼叫函式首先把引數放在堆疊的臨時儲存區域中,然後被調函式從堆疊中讀取這些引數。但這兩個過程並沒有相互協調進行,呼叫函式傳遞的是實參的型別,而被呼叫函式則是按照其形參的型別進行資料讀取。

從函式呼叫的原理我們可以看出:呼叫函式先將 int 型別的陣列data[size] 放入首位址為 0x00422fa8 的記憶體當中,我們用 memory 視窗可觀察 0x00422fa8 ~ 0x00422fcb 這部分記憶體所儲存的值,因為陣列型別為 int 型別,所以乙個元素佔4個位元組。

而被調函式則是按形參宣告的型別類呼叫堆疊裡的資料的,形參宣告的型別是 char 型別,所以形參是 1位元組1位元組 的呼叫堆疊裡的資料的,所以程式 for 迴圈中呼叫了10次數組的值相加也只是將 0x00422fa8 ~ 0x00422fb1 的值相加而已,所以導致程式得出錯誤的結果。

而我們將例程中的:

int sum(unsigned char *ar);

改為:

int sum(int *ar);
執行的結果為:

則它將會每隔4個位元組讀取堆疊的資料。

從這個易錯的例子我們可以很好的理解:函式呼叫的過程、陣列在記憶體中的儲存、陣列和指標等問題。

shell中的函式和陣列

shell指令碼中的函式 函式就是把一段 整理到了乙個小單元中,並給這個小單元起乙個名字,當用到這段 時直接呼叫這個小單元的名字即可。格式 function f name 函式必須要放在最前面 示例1 bin bash input input 1 a b 示例2 bin bash sum sum 1...

oracle的函式和陣列的使用

create or replace procedure funname aa in varchar2,bb in integer,result out types.cursortype return type table varchar2 integer is v un date v u1 varc...

陣列名和陣列名 二維陣列的傳參

首先我們看下面 include intmain printf p n arr printf p n arr printf arr 1 p n arr 1 printf arr 1 p n arr 1 return0 根據上面的 我們發現,其實 arr和arr,雖然值是一樣的,但是意義應該不一樣的。a...