将非const参数传递给C中的const函数参数

时间:2017-06-08 08:42:28

标签: c gcc const

我有一个函数,它指定一个const参数来向调用者表明它不会被修改:

int func1(const char *some_string) 
{
    // Do something non-destructive with some_string
}

我将一个非const变量作为参数传递给func1

int func2(void)
{
    char *my_string = "my text";
    func1(my_string);
}

gcc报道:

warning: assignment discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]

处理这种情况的正确方法是什么?创建my_string的const副本似乎有点多,但简单的转换似乎掩盖了警告。

3 个答案:

答案 0 :(得分:2)

您遇到的问题源自main功能。

当您声明char *my_string = "my text";时,您正在创建一个指向字符串文字的非const指针。按照设计,"my text"之类的字符串文字是不可变的,因此是语言中的const。 (实际上,编译器通常将字符串文字放入包含只读内存的可执行文件的特定部分,因此尝试使用非const指针修改文字可能会导致段错误。)

通过声明一个指向字符串文字的非const指针,最终会得到一个指针,你可以使用它来修改不可变的字符串文字,这在C中被认为是未定义的行为。

有关详细信息,请参阅this question

解决此问题的最简单方法是将char *my_string更改为const char *my_string

答案 1 :(得分:0)

您可以使用const char *my_string = "my text";代替char *my_string = "my text";

答案 2 :(得分:0)

出现错误是因为项目是使用-Wwrite-strings extra 警告进行编译的。默认情况下,任何常见的警告选项-Wall-Wextra都不会启用此警告,因为它甚至可以使严格符合条件的 C程序生成诊断消息。

char *foo = "bar";

本身就是严格符合的C片段,"bar"是类型char [4]的不可修改数组。不过,对类型使用char *并不是最佳实践,如果可能,应使用const char *foo代替。 -Wwrite-strings使这种最佳实践可见。它只是作为编写更好程序的助手,但它并没有发现真正的问题。