在C中,我尝试编译以下两个代码:
(1)
char a[] = "hello";
a[1] = 'b';
(2)
char *a = "hello";
a[1] = 'c';
首先成功编译,但第二次给出分段错误。我知道,在两种情况下'a'代表字符指针。你能解释一下这两种情况下的不同行为吗?事实证明,在第二种情况下,我可以使用[i]访问元素但不能更改它。
答案 0 :(得分:4)
问:我知道,在两种情况下'a'代表字符指针。
否强>
因为当您声明为char *a = "hello";
时,a
是常量字符串文字的指针,并且通过执行a[i] = 'A';
,您需要在只读内存上写入是非法的。
在第一个声明中char a[] = "hello";
,a
是任何数组,其内容由字符串"hello"
初始化,数组a[]
可以在后面进行修改在你的代码中。并且a[i] = 'A';
完全正确。
问:首先成功编译,但第二次出现分段错误。
您的代码已编译,因为语法明确a[i] = 'A';
是正确的。但在第一种情况下(char *a = "hello";
)指令
a[1] = 'c';
修改作为非法内存运算符的常量字符串文字,此指令会对运行时环境可检测到的有效内存位置执行无效操作,并发送终止信号SIGSEGV,导致程序因分段错误而终止。
答案 1 :(得分:2)
char *a = "hello";
表示指向常量字符串的指针,并且您尝试在只读内存位置写入,因此您将收到分段错误。
答案 2 :(得分:1)
第二种情况是undefined behavior
,您正在尝试修改字符串文字的内容。由于它未定义,它可以表现出任何行为,包括看似正常工作,但在这种情况下,你有一个分段错误。