1

如果输入的 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;

上述分配有效吗?

4

3 回答 3

5

在这里抛弃 const 可能会关闭编译器,但会导致运行时失败。制作字符串的副本并进行处理。

抛弃 const 不会复制内存的内容。它只是创建一个指向同一内存的指针,并告诉编译器它可以继续写入该内存。如果内存是只读的,则您有保护故障。更严重的是,您可能会遇到难以调试的正确性问题。不要抛弃 const。

当然,如果您需要修改一个变量并让调用者可以看到这些修改,那么您首先不应该将其设为 const。另一方面,如果修改是函数私有的,那么最好复制 const 参数。

作为一个广泛的规则,您应该尽可能避免强制转换。强制转换是最常见的错误来源之一。

于 2011-10-11T06:34:16.577 回答
2

如果s1指向的数组是,const那么你不能修改它;这样做会产生未定义的行为。在这种情况下,如果您需要修改它,那么您将不得不复制一份。更新:类型转换会给你一个指向同一个数组的指针,它仍然是const,所以你仍然不能修改(即使尝试这样做不再给出编译错误)。

如果您可以保证数组不是,那么您可以通过从指针中const丢弃 来修改它。在这种情况下,如果您可以通过首先不添加限定符来const强制执行该保证,那么出错的可能性就会降低。consts1

于 2011-10-11T06:57:44.027 回答
0

如果您的输入是 a const char*,那么您绝对应该听取编译器警告并不要理会它。

于 2011-10-11T06:34:29.007 回答