2013-03-21 66 views
3

我覺得這個問題是this SO answer的擴展。說我有以下代碼:C函數參數char * vs char []

#include <stdio.h> 
#include <string.h> 

void func(char *str) 
{ 
    strcpy(str, "Test"); 
} 

int main() 
{ 
    char testStr[20] = "Original"; 
    func(testStr); 
    printf("%s\n", testStr); /* Prints "Test" followed by a new-line */ 
    return 0; 
} 

按照我的理解,不應該指望func一個指針只讀文字作爲參數?而正在傳遞的是隻讀文本的堆棧上的副本

即使這會產生正確的結果,是否100%正確?如果func()接受char []而不是char *,它會提高代碼的可讀性嗎?

回答

5

你的理解是正確的。代碼很好。

以下,在另一方面,是不是:

void func(char *str) 
{ 
    strcpy(str, "Test"); 
} 

int main() 
{ 
    char* testStr = "Original"; 
    func(testStr); 
} 

這試圖修改字符串文字,從而導致不確定的行爲。

至於可讀性的問題,這是主觀的。

+0

除了可怕的安全漏洞.. – 2013-03-21 08:39:02

+0

@KierenJohnstone:好吧,沒有用戶輸入;) – NPE 2013-03-21 08:39:39

+0

@KierenJohnstone,拋開安全漏洞。我剛剛打了一個快速的SSCCE。 – 2013-03-21 08:40:04

0

所有字符串都是指向數組char的指針,所以它沒有區別。函數中沒有在堆棧中分配的字符串的副本,它與傳遞的是相同的,並且將該參數聲明爲數組不會爲該函數中的字符串分配任何存儲空間,這只是寫入相同內容的另一種方式。

但是,如果使用字符串文字初始化數組,則會將文字的副本放入數組中。字符串是否來自文字並不重要,因爲它是完全獨立的。

如果您希望使用文字,您可以將函數參數聲明爲const(如果需要),但肯定沒有要求。在C字符串中文字不是隻讀的,但會導致未定義的行爲改變它們。