我对C不熟悉,所以这可能是个愚蠢的问题。我在写一段代码,如下所示:
char ar[]="test";
*(ar+1)='r';这很好用。但每当我这么做的时候
char *p="test";
*(p+1)="r";这就产生了分割错误。有谁能描述一下为什么第二种情况会产生分割错误?从记忆的角度进行解释将不胜感激。
发布于 2013-11-30 04:51:51
在第二种情况下,p指向字符串文本,您不允许修改字符串文本,它是未定义行为。来自C99标准草案节6.4.5字符串字面值的第6段(强调我的意思):
如果这些数组的元素具有适当的值,则未指定这些数组是否不同。如果程序试图修改这样的数组,则行为为未定义的。
在第一种情况下,ar是一个自动变量,您可以修改它,因为它不是const。字符串文本的内容是在初始化或ar期间复制的。
发布于 2013-11-30 05:22:40
在c#中,每当您将字符串存储在数组中时,都可以允许更改字符串的内容。这样做的原因是,c将字符串的内容存储在连续内存中。
在指针的情况下,指针存储字符串的起始地址,并假定它是常量。假设你试图改变它。您得到一个未定义的行为,甚至更糟糕的情况是,您不能轻易地找到它,仅仅因为它不会抛出任何错误。
发布于 2013-11-30 06:23:41
示例'r‘== 114 (可能)的另一个方面,而"r“==是可执行文件中const字符串"r”的起始地址。
https://stackoverflow.com/questions/20296674
复制相似问题