2011-10-21 104 views
1

我有一個基本的說明。這是我試過的代碼片段。關於char數組的澄清

void fill(char s[]) 
{ 
    strcpy(s,"temp"); 
} 

int main() 
{ 
    char line[100]; 
    fill(line); 
    printf("%s",line); 
    return 0; 
} 

如預期的那樣,輸出是templine是本地數組,但它可以在fill中修改,並反映回調用者。我的理解是,這是有效的,因爲當我們說fill(line)我們實際上是傳遞一個數組的開始地址。

我正確嗎?

回答

3

是的你是正確的。

請注意,這是一個危險的代碼 - 使用這種類型的代碼fill覆蓋傳入的緩衝區的末尾非常容易。填充應該知道緩衝區的大小,不應該超過該大小的末尾。

例如,如果不是寫在戰爭與和平的內容中的「臨時」中,程序會愉快地覆蓋許多與變量line不相關的其他存儲位置。

0

是的,陣列通過C中的引用傳遞。

+1

不是,所有東西都按C中的值傳遞。在這種情況下,該值恰好是地址(即指針)。 – dmc

0

是的。在這種情況下,數組名稱衰減爲一個指針,然後傳遞給它進行填充。

0

是的,陣列通過使用它們的基地址

0

是的。這是正確的。如果你想明確指定起始地址,代碼只會稍微改變。見下面:請注意填充函數參數現在是一個指針。

void fill(char *s) 
{ 
    strcpy(s,"temp"); 
} 

int main() 
{ 
    char line[100]; 
    fill(line); 
    // EQUIVALENT: fill(&line[0]); 
    printf("v%s\n",line); 
    return 0; 
}