#include <stdio.h>
#include <conio.h>
void test(char *p)
{
p = p + 1;
*p = 'a';
}
int main()
{
char *str = "Hello";
test(str);
printf("%s", str);
getch();
return 0;
}
当我运行此代码时会出现分段错误?为什么会发生这种情况。 const理论对我来说并不清楚......如果我将str声明为char str [],它就能完成这项工作。它们不是基本相同的东西吗?
答案 0 :(得分:7)
str
指向一个字符串文字,您试图修改此行中函数test
中的字符串文字:
*p = 'a';
尝试修改字符串文字是undefined behavior
。或者,您可以将字符串文字的副本复制到数组中,如下所示:
char str[] = "Hello";
现在可以修改str
。来自draft C99 standard
部分6.4.5 String literals
段6
下:
如果这些数组的元素具有不同的数据,则未指定 适当的价值观如果程序试图修改这样的数组,则行为是 未定义。强>
答案 1 :(得分:5)
*p = 'a';
问题是上面的语句试图修改只读段。字符串文字"Hello"
位于只读段中,无法修改。
char str[] = "Hello";
上述语句将Hello
复制到str
字符数组,并且可以修改数组内容。