首先我們先上例程:
#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...