【问题标题】:Why does this code work in C? [duplicate]为什么这段代码在 C 中工作? [复制]
【发布时间】:2014-09-06 19:02:27
【问题描述】:
char *a= "ABC";

"ABC" 字符串属于const char* 类型。如何将其地址分配给char* 指针? 不应该是错误吗?

【问题讨论】:

  • 它是undefined behavior(见第一个例子)。
  • C 不像 C++ 那样类型严格——这就是原因
  • Char 不是 C 中的类型。你的意思是 char
  • 不,"ABC" 的类型为 char[4],在大多数(但不是全部)上下文中隐式转换为 char*。 (尝试修改字符串文字的行为未定义,但由于历史原因,它们不是const。)

标签: c string


【解决方案1】:
char *a = "ABC";

"ABC" 在 C 中属于 char [4] 类型,而在 C++ 中属于 const char [4] 类型。

【讨论】:

  • 你确定它在 C99 和 C11 中是真的吗?
  • @BasileStarynkevitch 是的
  • @BasileStarynkevitch:这是唯一一种不是const-modified...的常量文字...
  • 在修改此类字符串文字而不是段错误时,我无法回忆起任何不同的情况。那么,“ABC”是char类型,但它存储在只读存储器中?这是有道理的。
  • @mac:字符串字面量可以被池化,并且可以存储在只读内存中,如果存在的话,就像常量复合字面量一样。它们的类型在 C 和 C++03 及更早版本中仍然不是const 限定的(后来的版本修复了这个问题,正如当时不推荐使用的那样)。不能保证两者都会发生,也不能保证有任何只读内存。
【解决方案2】:

C 中的字符串文字具有非常量数组的类型。来自 C 标准(6.4.5 字符串文字):

然后使用多字节字符序列来初始化一个数组 静态存储持续时间和长度刚好足以包含 顺序。对于字符串文字,数组元素有 输入字符,并使用多字节字符序列的各个字节进行初始化。

尽管 C 中的字符串文字具有非常量数组的类型,但它们不应被修改。

如果程序试图修改这样的数组,行为是 未定义。

在这方面,例如标准 C 函数 strchr:) 的声明

char *strchr(const char *s, int c);

该函数返回一个指针,该指针指向与使用限定符 const 定义的参数相同的字符串。

在 C++ 中,字符串文字具有常量字符数组的类型。

来自 C++ 标准

8 普通字符串文字和 UTF-8 字符串文字也被引用 作为窄字符串文字。窄字符串文字具有类型 “array of n const char”,其中 n 是字符串的大小,定义如下,具有静态存储持续时间 (3.7)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多