【问题标题】:Why can I not modify a string literal in c?为什么我不能在 c 中修改字符串文字?
【发布时间】:2021-08-12 02:22:52
【问题描述】:

我试图了解无法在 C 中修改字符串文字的原因。

为什么下面的 C 语言是非法的?

char* p = "abc";
*p = 'd';

【问题讨论】:

  • 这并不违法,正如您所写的那样。您的代码将在C(以及C++)中编译。
  • @Adrian:仅仅因为它编译并不意味着它是合法/有效的。不是。
  • @R.. 语句char* p = "abc";p 声明为指向四个字符数组的指针;语句 *p = 'd'; 将值 d 分配给该数组的第一个元素。这有什么不合法的?
  • @Adrian: C 2018 6.4.5 7 说,对于由源文本中的字符串文字创建的数组,“如果程序尝试修改这样的数组,则行为未定义。”在 C++ 中,字符串字面量是一个由 const 字符组成的数组,在 char *p = "abc"; 中从 const char *char * 的隐式转换是不允许的。
  • 这真的是复制品吗?另一个似乎在问为什么提问者期望工作的东西不起作用。这个问题似乎在问为什么语言是这样的。请参阅:“无法做到的原因”。

标签: c


【解决方案1】:

来自C89 Rationale, 3.1.4 String literals

字符串文字被指定为不可修改。该规范允许实现共享具有相同文本的字符串副本,将字符串文字放置在只读内存中,并执行某些优化。但是,字符串文字没有 const char 的类型数组,为了避免指针类型检查的问题,特别是对于库函数,因为将指向 const char 的指针分配给指向 char 的普通指针是无效的。那些坚持字符串文字应该是可修改的委员会成员满足于将这种做法指定为公共扩展(参见 F.5.5)。

【讨论】:

  • 合法吗:char q[4] = "abc"; *q = 'd';?
  • @Adrian 是的,这是合法的,因为在这种情况下,字符串文字的副本存储在 q 中。您正在修改的是字符串文字的副本,而不是字符串文字本身。
  • @Pablo - 请参阅我在 OP 问题中的评论:我错了,R.. 是对的!
  • @Adrian 我不明白你的意思。我看到 R.. 是对的。但我在这个答案的第一条评论中回答了你的问题。
  • @Pablo 我承认我在问题中的评论有误(这促使我在这里发表评论)。我从来没有暗示你说的任何事情都是错误的。很抱歉造成混乱。
猜你喜欢
  • 2020-09-02
  • 2016-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
相关资源
最近更新 更多