C函数参数char * vs char []

时间:2013-03-21 08:37:23

标签: c function arguments

我认为这个问题是this SO answer的延伸。说我有以下代码:

#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 *,它是否会提高代码的可读性?

2 个答案:

答案 0 :(得分:5)

您的理解是正确的。代码很好。

另一方面,以下不是:

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

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

这会尝试修改字符串文字,从而导致未定义的行为。

关于可读性问题,这是主观的。

答案 1 :(得分:0)

所有字符串都是指向char数组的指针,因此没有区别。在函数的堆栈中没有分配字符串的副本,它与传递的相同,并且将参数声明为数组不会为函数中的字符串分配任何存储空间,这只是编写相同内容的另一种方式

但是,如果使用字符串文字初始化数组,则会将文字的副本放入数组中。字符串是否来自文字并不重要,因为它完全是分开的。

如果你想要一个文字,你可以根据需要将函数参数声明为const,但肯定没有要求。在C字符串中,字符串不是只读的,但它会导致未定义的行为更改它们。