我在两个不同的编译器上测试了下面的代码,它先崩溃但第二次工作正常吗?
代码是
char *str="testing";
*str='b';
printf("%c",*str);
b
崩溃的可能原因是什么?
答案 0 :(得分:2)
崩溃的原因是写入字符串文字的内存是未定义的行为。您的代码*str='b'
直接写入分配给字符串文字的第一个char
内存中。 C允许编译器将文字内容放入受保护以免写入的内存区域。在该区域的任何地方书写都会导致分段错误。
将声明更改为
char str[]="testing";
避免错误。如果将str
声明为char
数组(而不是char
指针),编译器会生成代码以将str
的内容复制到可写内存中,从而避免错误当你写信str
时。
答案 1 :(得分:0)
您正在写入字符串文字,这具有未定义的行为。
答案 2 :(得分:0)
通常(并且如您所见,在依赖于系统的基础上),字符串文字放在只读内存中,然后尝试更改它们将导致运行时错误。