当前位置: 首页 > 知识库问答 >
问题:

为什么从字符串常量到“char*”的转换在C中有效,但在C中无效

楚嘉
2023-03-14

C 11标准(ISO/IEC 14882:2011)在§C.1.1中规定:

char* p = "abc"; // valid in C, invalid in C++

对于C语言来说,指向字符串文字的指针是有害的,因为任何修改它的企图都会导致崩溃。但是为什么在C中有效呢?

C 11还说:

char* p = (char*)"abc"; // OK: cast added

这意味着如果强制转换被添加到第一条语句中,它将变得有效。

为什么铸件使第二个语句在C中有效,它与第一个语句有什么不同?它不是仍然有害吗?如果是这样,为什么标准说它可以?

共有3个答案

山阳辉
2023-03-14

您还可以使用 strdup:

char* p = strdup("abc");

char p[] = "abc";

如这里所指出的

闻人献
2023-03-14

由于历史原因,它在C中有效。C传统上指定字符串文字的类型是char*而不是const char*,尽管它通过说您实际上不允许修改它来限定它。

当您使用强制转换时,您实际上是在告诉编译器您比默认的类型匹配规则更了解,这样就可以进行赋值。

彭风华
2023-03-14

直到C 03,您的第一个示例是有效的,但使用了一种不推荐的隐式转换——字符串文字应被视为类型<code>char const*</code>,因为您无法修改其内容(而不会导致未定义的行为)。

从C 11开始,已经弃用的隐式转换被正式删除,因此依赖它的代码(如第一个示例)应该不再编译。

您已经注意到允许代码编译的一种方法:虽然隐式转换已被删除,但显式转换仍然有效,因此您可以添加转换。然而,我不会认为这是“修复”代码。

真正修复代码需要将指针的类型更改为正确的类型:

char const *p = "abc"; // valid and safe in either C or C++.

至于为什么它在C语言中被允许(现在仍然是C语言):这仅仅是因为有很多现有代码依赖于这种隐式转换,而在标准委员会看来,破坏这些代码(至少没有一些官方警告)显然是个坏主意。

 类似资料:
  • 你好,我正在尝试创建一个程序路径并放入注册表文件中,但我一直出错。这是代码: 我得到的错误说 从“char*”到“unsigned char”[-fppermissive]的转换无效 我花了几个小时寻找解决方案,但我找不到。

  • 本文向大家介绍在C ++中将ASCII值语句转换为其等效字符串,包括了在C ++中将ASCII值语句转换为其等效字符串的使用技巧和注意事项,需要的朋友参考一下 在本教程中,我们将讨论将ASCII值句子转换为其等效字符串的程序。 为此,我们将提供一个包含ASCII码的字符串。我们的任务是将给定的字符串转换为等效的字符并将其打印回来。 示例 输出结果

  • 问题内容: 在Java中,我有一个代码将Java对象转换为JSON字符串。如何在C#中执行类似操作?我应该使用哪个JSON库? 谢谢。 JAVA代码 问题答案: 我使用过Newtonsoft JSON.NET (文档),它允许您创建类/对象,填充字段并序列化为JSON。

  • 我有一个像“示例”这样的字符串。我想得到十六进制格式的字符串;像这样: 请给出C#语法。

  • 我想优化我的代码,避免错误,我有这个功能,但我认为我可以改善和避免内存问题。 该函数的思想是接收这种样式的字符串“0123456789”并将其传递给0x01、0x23、0x45、...在无符号字符数组中。任何提示,良好的实践或改进将是非常有用的。 用法是这样的: 在函数缓冲区中结束如下:

  • 问题内容: 我试图将const char *传递给从Swift中的Swift字符串转换而来的旧C库。 这是我正在调用的C函数: 如何将Swift字符串转换为这种const char类型?当我像这样传递ipAddress时,它可以工作: 但是当我这样通过时dit不起作用 我在需要指定类型的函数中需要它: 我尝试使用AnyObject而不是String,但这也不起作用。 谢谢。 问题答案: 不知道为什