【问题标题】:Why can I modify a string literal with CLion?为什么我可以使用 CLion 修改字符串文字?
【发布时间】:2020-09-16 07:53:54
【问题描述】:
#include <stdio.h>

int main() {
    char *name = "Thank you";
    name[0] = 'a';
    printf("%s", name);
}

而且效果很好:

我的理解是name[0] = 'a' 应该不起作用。

那么它为什么有效呢?

【问题讨论】:

    标签: c string pointers char string-literals


    【解决方案1】:

    C 标准对尝试修改字符串文字没有任何限制。但是,如果您尝试修改字符串文字,则结果为 undefined behaviour

    引用C11,第 6.4.5 章(字符串文字)/P7

    [...] 如果程序尝试修改这样的数组,则行为未定义。

    您认为程序允许您修改字符串文字的内容这一事实是 UB 的众多结果之一。

    【讨论】:

    • 你的前两句话似乎完全相反。
    • @interjay 我不这么认为。它说,C 中没有任何东西应该引发错误或阻止你这样做(即编写代码来执行),但如果你这样做了,结果就是 UB。
    • 这是一种相当奇怪和误导性的看待事物的方式。我会说 UB 绝对是应该阻止你这样做的东西。这就像说“没有什么可以阻止您使用未声明的标识符,但如果您这样做了,您会收到编译器错误”。
    【解决方案2】:

    您的理解几乎是正确的,程序确实格式不正确,但这并不意味着它应该出现故障或失败,它会调用未定义的行为。

    不幸的是,未定义行为的可能症状之一是程序表现出应有的行为。

    N1570 ISO/IEC 9899:201x §3.4.3 中描述的未定义行为

    1 未定义的行为

    在使用本国际标准没有要求的不可移植或错误程序结构或错误数据时的行为。

    2 注意

    可能的未定义行为范围从完全忽略具有不可预测结果的情况,到在翻译或程序执行期间以环境特征的记录方式表现(无论是否发出诊断消息),到终止翻译或执行(发出诊断消息)。

    【讨论】:

      猜你喜欢
      • 2021-12-24
      • 2021-08-12
      • 2020-09-02
      • 1970-01-01
      • 1970-01-01
      • 2014-03-04
      • 2013-02-10
      相关资源
      最近更新 更多