当试图访问字符串中的字符时出现总线错误C

问题描述:

我已经多次使用这行代码(更新:当字符串是函数的参数!),但是当我现在尝试这样做时,我得到一条总线错误(包括gcc和clang)。我正在复制最简单的代码;当试图访问字符串中的字符时出现总线错误C

char *string = "this is a string"; 
char *p = string; 
p++; 
*p='x'; //this line will cause the Bus error 
printf("string is %s\n",string); 

为什么我无法使用p指针更改字符串的第二个字符?

+1

gcc有选项'-Wwrite-strings',它会通过使它们成为'const char []'来警告你改变文字字符串。请注意,标准中的字符串实际上是'char []'(“'只读char []'”,而不是'const')并且使它们成为'const'会使得您的编译器(更多)不符合标准。 – pmg 2010-11-09 00:00:10

您正试图修改只读内存(其中存储了该字符串文字)。如果需要修改该内存,则可以使用char数组。

char str[] = "This is a string"; 
str[0] = 'S'; /* works */ 

我已经使用这个代码行多次..

我当然希望不会。最好你会得到一个段错误(我说“最好”,因为试图修改只读内存是未指定的行为,在这种情况下,任何事情都可能发生,崩溃是可能发生的最好的事情)。

当你声明一个字符串文字的指针时,它指向数据段中的只读存储器(如果你喜欢的话,看一下汇编输出)。将您的类型声明为char []将会将该文字复制到函数的堆栈中,如果需要的话,这又可以修改它。

+1

+1。尝试修改字符串文字是未定义的行为。它可能似乎工作,但当然,它不能保证。 – dreamlax 2010-11-09 00:01:39

+0

“最好你会得到一个段错误” - 实际上,这一点不完全正确。未定义的行为是未定义的,并且有时候意味着它按预期工作:-)有很多嵌入式芯片没有内存保护。不要说你的_answer_是错误的,因为问题被标记为linux(所以+1),只是一个特定的点在所有情况下都不一定是真的。 – paxdiablo 2010-11-09 00:02:27

+0

@paxdiablo:因此,“最好”部分=) – 2010-11-09 00:04:21