数组和指向字符串文字的指针之间的区别
我是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”的开头地址