[英]Passing a local array that declared in a function to another one
我的頭銜清楚地表達了我的問題。 讓我借此機會:
請看下面的代碼:
#include <stdio.h>
int myf2(int *ser){
*ser=4;
printf("\nsecond=%d",*ser);
return 0;
}
int myf1(){
int fil[2];
fil[0]=1;
printf("\nfirst=%d",*fil);
myf2(fil);
printf("\nthird=%d",*fil);
return 0;
}
int main(){
myf1();
}
我期望這個輸出:
first=1
second=4
third=1
輸出為:
first=1
second=4
third=4
那么我如何將fil數組傳遞給myf2函數,以便第三個printf打印1而不是4
您能解釋一下為什么我的代碼錯誤嗎? 我在本地聲明此數組。 但正如您所見,它實際上不是本地的:)
最好的祝福
當將數組傳遞給函數時,實際上是在傳遞指向列表中第一個元素的指針。
在您的函數中, ser
指向列表中的索引0。 因此, *ser
與ser[0]
相同。 同樣,在定義fil
情況下, *fil
等效於fil[0]
。
當然,按值傳遞數組。 不幸的是,這在當前的“ C”語言中是不可能的(因為錯誤的設計決策)。 這就是為什么您應該使用結構hack,使數組成為數據成員,因為可以直接復制結構。 因此,您的示例將如下所示:
#include <stdio.h>
typedef struct {
int d[2];
} array_of_2;
int myf2(array_of_2 ser){
*ser.d=4;
printf("\nsecond=%d",*ser.d);
return 0;
}
int myf1(){
array_of_2 fil;
fil.d[0]=1;
printf("\nfirst=%d",*fil.d);
myf2(fil);
printf("\nthird=%d",*fil.d);
return 0;
}
int main(){
myf1();
}
不幸的是,您必須使用點和'd'引用數組,因為類型'array_of_2'實際上是一個結構。
在這種情況下,實際上是在將指針傳遞給數組的第一個元素。 因此,“ myf2”本地(也是一個功能參數)“ ser”將僅接收“ myf1”范圍內的本地地址,然后對其進行編輯。
一些插圖:
局部變量和所有其他此類變量(例如全局變量)僅在其生存時間方面是特殊的。 否則,對於可以編輯它們的功能沒有任何限制。
變量在第一次滿足聲明時是保留內存,並在作用域結束時釋放(對於函數返回的本地變量)。 同時,該存儲器可以通過其他功能自由編輯。
實際上,變量是兩件事,一個標識符 ,即您為其指定的名稱,以及一個對象 ,即您所命名的東西。
作用域的概念僅適用於標識符:它是代碼的一部分,在該代碼中,可以使用您指定的名稱訪問對象。 范圍是編譯時功能。
對象沒有作用域,有生命周期。 對於此處使用的局部變量,生命周期從您的執行進入聲明該變量的作用域時開始,並在永久保留該變量時結束。 在調用myf2
您的對象繼續存在,因此可以毫無問題地進行訪問。
這種訪問是通過傳遞給調用中的函數的指針完成的。 由於指針指向原始對象,因此您在此處所做的所有更改都是對原始對象的更改,並且在您從調用返回時仍然可見。
您的代碼沒有錯。 本地數組將一直保留到myf1
的作用域存在為止。 只需傳遞數組的基本元素的地址即可,從而對原始數組進行更改。
所以要解決您的問題-
int myf2(int *ser)
聲明您充當int myf2(int ser)
在函數中執行ser=4
。
在函數myf1
像這樣調用myf2
- myf2(*fil);
因此fil
值不會改變,因為*fil
的副本已創建並修改為4
,從而使*fil
原始值保持不變。
工作代碼-https : //ideone.com/g32wnQ
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.