2016-02-07 38 views
-1

函數可以用來複制一個數組中的元素並將其保存到另一個數組中,而不會將數組返回到main.Because一旦我們從函數中退出,那麼所有局部變量都將丟失。例如編程語言C

void copy(char to[],char from[]) 
{ 
    int i; 
    while((to[i]=from[i])!='\0') 
    ++i; 
} 

請問這個代碼的工作呢?因爲從array.After功能從數組複製元素後執行所有的變量必須丟失並沒有什麼 必須從陣列功能後,可以保存爲executed.Please澄清我懷疑。

+1

有沒有聽說過指針? –

+3

他是新的,更友好。 – PhotometricStereo

+3

你需要將'i'初始化爲'0'來解決這個問題。請記住,「我」最初是未定義的,可能有任何價值。 –

回答

1

函數執行完後,所有的變量都必須丟失,並且在執行函數後不需要保存任何數組。

不完全是。

通常C使用按值調用,這意味着該函數處理參數的副本,因此無法修改它們。

爲了直接修改變量,您需要傳遞變量的地址(即指向它的指針),該函數然後通過指針訪問變量並可以直接修改它。

將數組傳遞給函數時,情況也是如此,傳遞函數的值是數組第一個元素的位置/地址。函數本身可以訪問和修改數組中的任何元素。

總之,您的功能copy修改陣列to完全可以。通常你應該將from設置爲const,因爲你沒有在函數內改變它。因此,原型應該是這樣的:

void copy(char to[], const char from[]);

1

此行

void copy(char to[],char from[]) 

實際上並不由值取兩個數組。相反,[]衰變爲指針,你實際上寫的是:

void copy(char* to, char* from) 

這是因爲array-pointer-equivalence。該語言無法說明它編譯函數時需要複製的陣列有多大,因爲每次都可能會有所不同。

因此,只有指針tofrom是本地的,它們指向的數據與在main中指向的數據相同。

2

數組通過指針傳遞(在C中使用引用的方式)。所以當數據在函數主體中被修改時,調用函數可以訪問修改後的數據。

功能執行後所有的變量必須丟失, 沒有必須從陣列函數被執行後保存。

確實,在函數存在時,在函數的生命週期內具有生命力的對象將會丟失。然而,函數的生命週期對其之前或之後存在的對象沒有影響。

+0

我遇到的主要問題是要了解函數的生命週期完成後,從數組複製的元素是否存在於from數組中 – user150025

0

雖然局部變量在函數結束時(範圍關閉)丟失,但這僅適用於tofrom本身 - 不是它們可能指向的內容。

順便說一句,你的代碼被打破,試試這個來代替:

void copy (char * to, char * from) { 
    while ((*to = *from) != '\0') {to++; from++;} 
} 

無論這個版本和你盲目地假定to足夠長,以容納結果。這是潛在的危險代碼。