为了账号安全,请及时绑定邮箱和手机立即绑定

为什么在此C程序段错误中写入字符串文字?

为什么在此C程序段错误中写入字符串文字?

C
jeck猫 2019-11-04 13:11:43
#include<stdio.h>void main(){    char *p="nyks";    p[2]='n';    printf("%s",p);}这会因SEGMENTATION FAULT崩溃。有人可以解释为什么吗?C
查看完整描述

3 回答

?
潇潇雨雨

TA贡献1833条经验 获得超4个赞

该标准要求定义文字字符串const。您无法更改。

编译器将文字放在只读存储器部分中。您可以输出装配并遵守该要求。如果您使用的是GCC,则通过-s标志完成。它将把字符串放在.rodata节中。


查看完整回答
反对 回复 2019-11-04
?
汪汪一只猫

TA贡献1898条经验 获得超8个赞

尝试覆盖字符串文字是未定义的行为。C99§6.4.5/ 6:


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


附录J.2(未定义的行为)中对此进行了重申。


如果您改为:


char p[] = "nyks";

您可以分配和初始化自动(堆栈)字符数组。在这种情况下,修改元素就很好了。


查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 445 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信