2013-09-26 75 views
1

我能做到這一點在C:靜態分配數組作爲C函數參數

void myFunc(int *vp) { 
    // do some stuff with vp 
} 

int main() { 

    int v[5] = {1,2,3,4,5}; 
    myFunc(v); 

    return 0; 
} 

我的意思是,這將是正確的? myFunc(& v); ?

謝謝!

+1

你問是因爲你有錯誤還是詢問它是否一致? – Ryan

+4

試試吧。運行。也許它有效。無論哪種方式,你學到了一些東西。 :) – Bucket

+0

是的!我似乎工作。當我在VS2012上運行它時,一切看起來都很好。但是當我在Linux上運行它時,出現了分段錯誤。我不知道這是否是問題。經過4個小時的計算,我得到了分段錯誤。我問,因爲我懷疑這可能是問題所在。 –

回答

3

當您將它們作爲參數傳遞時,數組衰減爲指針。但是,數組衰減與獲取數組地址不同。

「衰退」是如何將某些類型作爲函數參數傳遞時進行轉換。即使v的類型爲int [5],但在將其傳遞給函數時,它將變爲int*。這是很多人不喜歡的行爲,但沒有關係。

請注意,另一方面,&v的類型是int (*)[5],也就是指向一個由5個整數組成的數組的指針。這種類型不會衰減,也就是說,如果將它作爲函數參數傳遞,它不會自動轉換爲另一種類型(並且這也是爲什麼在您的示例中使用它時不起作用,因爲您需要一個指針整數,而不是一個整數數組的指針)。

「正確」的事情(假設衰退是好的)就是做myFunc(v),就像你在你的代碼片段中做的那樣。請記住,當你這樣做時,你會失去數組邊界信息。

1

是的......你的代碼是正確的。

這裏v==&v[0]陣列名稱等於陣列

myFunc(v); 

傳遞數組名作爲參數,這意味着要傳遞第一元件的地址在陣列的第一個元素的地址。

void myFunc(int *vp) 

這裏您使用的是指針。它存儲了傳遞的數組的第一個元素的地址,以便您可以通過增加指針位置來訪問數組所覆蓋的塊。

而且

myFunc(&v); 

    &v==&&v[0]; 

& v是陣列的第一元件的地址的地址。

現在

void myFunc(int *vp)  

在這裏,你得到了數組第一個元素的地址,這不是指向數組的地址。而是指向一些內存位置。現在,您不能通過增加指針來訪問數組。

1

你的代碼是正確的它會工作.... 但你應該格外小心檢查邊界條件。 請仔細查看代碼。

void myFunc(int *vp) { 
    vp[5] = 30; 
} 

int main() { 

    int v[5] = {1,2,3,4,5}; 
    int a = 10; 
    printf("Value of a before fun call %d\n", a); 
    myFunc(v); 
    printf("Value of a before fun call %d\n", a); 
    return 0; 
} 

同樣

void myFunc(int *vp) { 
    vp[5] = 30; 
    myFunc2(vp); 
} 

void myFunc2(int *vp) { 
    vp[6] = 30; 
} 

int main() { 

    int v[5] = {1,2,3,4,5}; 
    int a = 10; 
    printf("Value of a before fun call %d\n", a); 
    myFunc(v); 
    printf("Value of a before fun call %d\n", a); 
    return 0; 
} 

這將導致由於堆棧curruption段故障。由於局部變量處於堆棧狀態。