数组和指向字符串文字的指针之间的区别

我是C的新手,所以这可能是一个愚蠢的问题。 我正在编写一段代码如下:

char ar[]="test"; *(ar+1)='r'; 

这工作正常。 但无论何时我这样做:

 char *p="test"; *(p+1)="r"; 

这是分段错误 。 任何人都可以描述为什么第二种情况会给出分段错误? 从记忆的角度来解释将不胜感激。

在第二种情况下, p指向字符串文字,并且不允许修改字符串文字 ,它是未定义的行为 。 从C99标准草案第6.4.5字符串文字6段( 强调我的 ):

如果这些数组的元素具有适当的值,则这些数组是否不同是未指定的。 如果程序试图修改此类数组,则行为未定义

在第一种情况下, ar是一个自动变量,你可以修改它,因为它不是const限定的。 在初始化或ar期间复制字符串文字的内容。

在ac中,只要您将字符串存储在数组中,就可以允许更改字符串的内容。 为此,c将字符串的内容存储在连续的内存中。

在指针的情况下,指针存储了字符串的起始地址,并假定它是常量。 假设,你试图改变它。 你得到一个未定义的行为,即使最坏的情况是,你不能轻易找到它只是因为它不会抛出任何关于此的错误。

示例的另一个方面’r’== 114(可能),而“r”==可执行文件中const字符串“r”的开头地址