如何将字符串值传递给C中的函数

时间:2017-03-23 22:20:13

标签: c string

这困扰我。它给了我一个警告

passing argument 1 of ‘funcName’ discards qualifiers from pointer target type

然而,程序运行得很好并打印提交的值。

功能如下

void funcName(char *str) {
    printf("%s", str);
}

void main() {
    funcName("Hello world");
}

输出是Hello world。

2 个答案:

答案 0 :(得分:5)

因为"Hello, world"是常量,所以将函数更改为

void funcName(const char *text) 
{
    printf("%s\n", text);
}

字符串文字是常量,它们存储在程序的只读存储器部分,传递没有const的指针意味着你可以在目标函数内意外修改它,如果这样做,那将导致未定义的行为,编译器正试图保护您免受此攻击。

此外,void main()不是main()的标准合规有效签名,您可以在标准之前的旧书中找到它,但现在它已不再被接受,接受和标准签名

  • int main(void)如果您不处理命令行参数。
  • int main(int argc, char **argv)处理argc中存储在命令行中传递的argv个参数。

答案 1 :(得分:2)

似乎问题是这个C程序被编译为C ++程序。

在C ++中,字符串文字具有常量字符数组的类型。因此,如果在C ++程序中,您将字符串文字作为参数提供给具有相应参数但没有限定符const的函数,则编译器将发出消息。

如果要将程序编译为C程序,则代码有效,因为在C字符串文字中有非常量字符数组的类型,编译器不应发出相对于限定符的诊断消息。

然而,无论如何最好声明像

这样的函数
void funcName( const char *str );
               ^^^^^^

因为在这种情况下,函数的用户可以确保传递给函数的字符串不会被更改。

考虑到没有参数的函数main应该在C中声明,如

int main( void )