【问题标题】:C function argument char * vs char []C 函数参数 char * vs char []
【发布时间】:2013-03-10 16:16:03
【问题描述】:

我认为这个问题是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 不应该期望一个指向 只读 文字的指针作为参数吗?然而,传递的是只读文字堆栈上的 copy

即使这会产生正确的结果,这样做是否 100% 正确?如果func() 接受char [] 而不是char *,是否会提高代码的可读性?

【问题讨论】:

    标签: c function arguments


    【解决方案1】:

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

    另一方面,以下不是:

    void func(char *str)
    {
        strcpy(str, "Test");
    }
    
    int main()
    {
        char* testStr = "Original";
        func(testStr);
    }
    

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

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

    【讨论】:

    • @KierenJohnstone:嗯,没有用户输入;)
    • @KierenJohnstone,除了安全漏洞。我刚刚创建了一个快速的 SSCCE。
    • @NPE,感谢您的回答。我目前没有任何 Linux 操作系统,因此无法使用 gcc -Wall 进行测试。该编译会产生任何警告吗?
    • @KierenJohnstone,顺便说一句,您发现了哪些安全漏洞?我只看到strcpy()(而不是strncpy())。
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-20
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      相关资源
      最近更新 更多