使用字符指针修改字符串

时间:2013-07-29 15:32:08

标签: c

在C中,我尝试编译以下两个代码:
(1)

char a[] = "hello";
    a[1] = 'b';

(2)

char *a  = "hello";
  a[1] = 'c';   

首先成功编译,但第二次给出分段错误。我知道,在两种情况下'a'代表字符指针。你能解释一下这两种情况下的不同行为吗?事实证明,在第二种情况下,我可以使用[i]访问元素但不能更改它。

3 个答案:

答案 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,您正在尝试修改字符串文字的内容。由于它未定义,它可以表现出任何行为,包括看似正常工作,但在这种情况下,你有一个分段错误。