【问题标题】:Typecasting string and strdup类型转换字符串和 strdup
【发布时间】:2011-12-05 01:08:42
【问题描述】:

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

上述分配有效吗?

【问题讨论】:

  • 这取决于您需要修改 const 字符串的原因的详细信息。

标签: c string casting strdup


【解决方案1】:

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

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

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

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

【讨论】:

  • 没有什么要补充的了。例如,字符串文字驻留在只读内存中,当您尝试写入该内存时,丢弃 const 将导致保护错误。不要抛弃 const。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • s1 在我的情况下绝对是 const 。那么你是说 strdup 是比类型转换更好的选择吗?
    • 这正是我们要告诉你的!
    • @user32262:是的,类型转换指针会给你一个指向同一个数组的指针,你仍然不能修改。我已经更新了我的答案以澄清。
    猜你喜欢
    • 2014-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-05
    • 1970-01-01
    • 2013-03-08
    • 2021-03-30
    相关资源
    最近更新 更多