2013-03-21 112 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字符串中文字不是只读的,但会导致未定义的行为改变它们。