4

我认为这个问题是这个 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 *吗?

4

2 回答 2

8

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

另一方面,以下不是:

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

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

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

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

于 2013-03-21T08:38:32.080 回答
0

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

但是,如果您使用字符串文字初始化数组,则会将文字的副本制作到数组中。字符串是否来自文字并不重要,因为它是完全独立的。

如果您期望一个文字,您可以像const您想要的那样声明函数参数,但当然没有要求。在 C 中,字符串文字不是只读的,但它会导致未定义的行为改变它们。

于 2013-03-21T08:47:48.863 回答