【问题标题】:What is the difference in using variable as function argument and in using directly string as function argument?使用变量作为函数参数和直接使用字符串作为函数参数有什么区别?
【发布时间】:2020-05-18 19:22:04
【问题描述】:

我正在制作一些将字符串作为函数参数的函数,但是

// This is working fine
char string[] = "Any string";
func(string);

//This is not working
func("Any string");

请告诉我区别

【问题讨论】:

  • 如果func 尝试修改字符串,那么传递文字是未定义的行为。
  • 是的函数修改字符串
  • 请告诉我“传递文字是未定义的行为”是什么意思。
  • 传递文字不是未定义的行为。但是如果函数试图改变字面量的值,那么改变它的尝试是未定义的,因此将字面量传递给函数将导致未定义的行为。

标签: c function arguments


【解决方案1】:

使用变量作为函数参数和直接使用字符串作为函数参数有什么区别?

char string[] = "Any string";
func(string);
// VS.
func("Any string");

string[] 是用"Any string" 的大小和内容初始化的字符数组。

"Any string" 是一个字符串字面量


如果func()func(const char *s),则没有区别,因为func() 只是读取字符串。

如果func()func(char *s),但没有修改s指向的字符串,那么func()只是读取字符串没有区别。

如果func()func(char *s),并尝试修改s OP later reports this 指向的字符串,那么func(string) 是可以的,因为string 是一个可修改的字符数组。然而func("Any string")未定义的行为 (UB)。 @John3136 @William Pursell 代码不应尝试修改字符串文字。由于 OP 报告第一个作品和第二个“不工作”,这是主要嫌疑人。

为了确定,func() 的定义是必要的,因为其他解释也是可能的。

【讨论】:

    【解决方案2】:

    根据您的描述,您的函数的原型似乎

    func(char* str);
    

    func(char str[]);
    

    现在问题出在字符串的数据类型上。当您 func("Any string"); 需要一个指针值(因为数组也可以用作指针)时,您给它一个字符串值,由于参数不匹配,这肯定会产生错误。

    如果你仍然想传递一个字符串,使用这个:

    str = "Any String";
    func(str.toCharArray());
    

    【讨论】:

    • “使用”处方看起来更像 C++ 而不是 C。您想用 C 重写还是解释它在 C 中的工作原理?或者你可以删除它。
    【解决方案3】:

    好的,所以....当你声明一个“文本字符串”时,它的类型是:

    const char* const text = "text string";
    

    现在您可以将其复制到 char 缓冲区,这样就可以了:

    char string[] = "Any string";
    

    因为在此上下文中的“字符串”是原始文本的副本(具有它自己的内存)。 然而这并不好:

    char* ptr = "Some Text";
    

    原因是“某些文本”是不变的,您要求将其称为一些可以更改的内存。这对我来说意味着您的 'func' 具有以下原型:

    void func(char* str);
    

    现在在上面的示例中,您可以将“字符串”传递给它,因为类型匹配。但是,您不能传递“任何字符串”,因为它是常量。但是,如果原型是:

    void func(const char* str);
    

    那么应该没有问题。

    【讨论】:

    • 第一点不正确。在 C 中,正如 here 所解释的,字符串文字的类型是 char [],没有任何 const。您可以在任何使用char * 的地方使用它,但修改字符串是未定义的行为。
    猜你喜欢
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-29
    相关资源
    最近更新 更多