簡體   English   中英

將在函數中聲明的本地數組傳遞給另一個數組

[英]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。 因此, *serser[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的作用域存在為止。 只需傳遞數組的基本元素的地址即可,從而對原始數組進行更改。

所以要解決您的問題-

  1. int myf2(int *ser)聲明您充當int myf2(int ser)

  2. 在函數中執行ser=4

  3. 在函數myf1像這樣調用myf2 - myf2(*fil);

因此fil值不會改變,因為*fil的副本已創建並修改為4 ,從而使*fil原始值保持不變。

工作代碼-https : //ideone.com/g32wnQ

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM