我是 C 的新手,所以这可能是一个愚蠢的问题。我正在编写一段像bellow一样的代码:
char ar[]="test";
*(ar+1)='r';
这很好用。但每当我这样做时:
char *p="test";
*(p+1)="r";
这是分段错误。任何人都可以描述为什么第二种情况会给出分段错误?从记忆的角度来解释将不胜感激。
答案 0 :(得分:5)
在第二种情况下,p
指向字符串文字,并且不允许修改字符串文字,它是undefined behavior 。来自C99 draft standard部分6.4.5
字符串文字段 6 (强调我的):
如果这些数组的元素具有不同的数据,则未指定 适当的价值观如果程序试图修改这样的数组,则行为是 未定义强>
在第一种情况下,ar
是一个自动变量,您可以修改它,因为它不是 const 限定的。正在初始化期间复制字符串文字的内容或ar
。
答案 1 :(得分:1)
在c中,只要你在数组中存储一个字符串,就可以允许更改字符串的内容。为此,c将字符串的内容存储在连续的内存中。
在指针的情况下,指针存储了字符串的起始地址,并假定它是常量。假设,你试图改变它。你得到一个未定义的行为,即使最糟糕的情况是,你不能轻易找到它只是因为它不会抛出任何关于此的错误。
答案 2 :(得分:1)
示例的另一个方面'r'== 114(可能),而“r”==可执行文件中字符串“r”开头的地址