数组和指向字符串文字的指针之间的差异

时间:2013-11-30 04:50:57

标签: c memory-management undefined-behavior

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

char ar[]="test";

*(ar+1)='r';

这很好用。但每当我这样做时:

char *p="test";

*(p+1)="r";

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

3 个答案:

答案 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”开头的地址