Typecasting字符串和strdup

时间:2011-10-11 06:27:59

标签: c string casting strdup

如果以某种方式修改输入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;

以上作业是否有效?

3 个答案:

答案 0 :(得分:5)

在这里抛弃const可能会关闭编译器但会导致运行时失败。复制字符串并对其进行处理。

转换const不会复制内存的内容。它只是创建一个指向同一内存的指针,并告诉编译器它可以直接前进并写入该内存。如果内存是只读的,则会出现保护错误。更严重的是,您可能会遇到难以调试的正确性问题。不要抛弃const。

当然,如果你需要修改一个变量并让这些修改对调用者可见,那么你不应该首先使它成为const。另一方面,如果修改是对函数私有的,那么复制const参数是最好的。

作为一项广泛的规则,如果可能的话,你应该尽量避免演员表。演员阵容是最常见的错误来源之一。

答案 1 :(得分:2)

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

如果可以保证数组不是const,那么可以通过从指针中丢弃const来修改它。在这种情况下,如果您可以通过不首先向const添加s1限定符来强制执行该保证,那么它将更不容易出错。

答案 2 :(得分:0)

如果您的输入是const char*,您肯定应该听取编译器警告并不管它。