我能做到這一點在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); ?
謝謝!
我能做到這一點在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); ?
謝謝!
當您將它們作爲參數傳遞時,數組衰減爲指針。但是,數組衰減與獲取數組地址不同。
「衰退」是如何將某些類型作爲函數參數傳遞時進行轉換。即使v
的類型爲int [5]
,但在將其傳遞給函數時,它將變爲int*
。這是很多人不喜歡的行爲,但沒有關係。
請注意,另一方面,&v
的類型是int (*)[5]
,也就是指向一個由5個整數組成的數組的指針。這種類型不會衰減,也就是說,如果將它作爲函數參數傳遞,它不會自動轉換爲另一種類型(並且這也是爲什麼在您的示例中使用它時不起作用,因爲您需要一個指針整數,而不是一個整數數組的指針)。
「正確」的事情(假設衰退是好的)就是做myFunc(v)
,就像你在你的代碼片段中做的那樣。請記住,當你這樣做時,你會失去數組邊界信息。
是的......你的代碼是正確的。
這裏v==&v[0]
陣列名稱等於陣列
myFunc(v);
傳遞數組名作爲參數,這意味着要傳遞第一元件的地址在陣列的第一個元素的地址。
void myFunc(int *vp)
這裏您使用的是指針。它存儲了傳遞的數組的第一個元素的地址,以便您可以通過增加指針位置來訪問數組所覆蓋的塊。
而且
myFunc(&v);
&v==&&v[0];
& v是陣列的第一元件的地址的地址。
現在
void myFunc(int *vp)
在這裏,你得到了數組第一個元素的地址,這不是指向數組的地址。而是指向一些內存位置。現在,您不能通過增加指針來訪問數組。
你的代碼是正確的它會工作.... 但你應該格外小心檢查邊界條件。 請仔細查看代碼。
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段故障。由於局部變量處於堆棧狀態。
你問是因爲你有錯誤還是詢問它是否一致? – Ryan
試試吧。運行。也許它有效。無論哪種方式,你學到了一些東西。 :) – Bucket
是的!我似乎工作。當我在VS2012上運行它時,一切看起來都很好。但是當我在Linux上運行它時,出現了分段錯誤。我不知道這是否是問題。經過4個小時的計算,我得到了分段錯誤。我問,因爲我懷疑這可能是問題所在。 –