如果以某种方式修改输入const字符串(这导致C编译器警告),处理它的最佳方法是什么 - 将其类型化为新变量然后使用它或复制它并使用它然后释放它。或者有没有其他方法来处理这种情况。请建议。任何帮助将不胜感激。
//类型映射
const char * s1;
char * s2 = (char *)s1;
//重复且免费
const char * s1;
char * s2 = strdup( s1 );
free(s2)
编辑:它是一个C编译器;不是C ++。我不确定在类型转换中,s2是字符串s1的新副本还是指向原始字符串s1?
感谢您的回答。我还有一个疑问 -
const char * c1;
const char * c2 = c1;
以上作业是否有效?
答案 0 :(得分:5)
在这里抛弃const可能会关闭编译器但会导致运行时失败。复制字符串并对其进行处理。
转换const不会复制内存的内容。它只是创建一个指向同一内存的指针,并告诉编译器它可以直接前进并写入该内存。如果内存是只读的,则会出现保护错误。更严重的是,您可能会遇到难以调试的正确性问题。不要抛弃const。
当然,如果你需要修改一个变量并让这些修改对调用者可见,那么你不应该首先使它成为const。另一方面,如果修改是对函数私有的,那么复制const参数是最好的。
作为一项广泛的规则,如果可能的话,你应该尽量避免演员表。演员阵容是最常见的错误来源之一。
答案 1 :(得分:2)
如果s1
指向的数组是const
,那么不得修改它;这样做会给出不确定的行为。在这种情况下,如果您需要修改它,那么您将需要复制。更新:类型转换会给你一个指向同一个数组的指针,它仍然是const
,所以你仍然不能修改(即使尝试这样做不再给出编译错误)。
如果可以保证数组不是const
,那么可以通过从指针中丢弃const
来修改它。在这种情况下,如果您可以通过不首先向const
添加s1
限定符来强制执行该保证,那么它将更不容易出错。
答案 2 :(得分:0)
如果您的输入是const char*
,您肯定应该听取编译器警告并不管它。