Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 以下代码崩溃的可能原因?_C_Pointers_Crash_Char - Fatal编程技术网

C 以下代码崩溃的可能原因?

C 以下代码崩溃的可能原因?,c,pointers,crash,char,C,Pointers,Crash,Char,我在两个不同的编译器上测试了以下代码,它在第一个编译器上崩溃了,但在第二个编译器上运行良好 代码是 char *str="testing"; *str='b'; printf("%c",*str); 输出:在第一个编译器上崩溃 第二个编译器上的b 崩溃的可能原因是什么?崩溃的原因是写入字符串文本的内存是未定义的行为。您的代码*str='b'直接写入分配给字符串文本的内存的第一个char。C允许编译器将文本的内容放入受保护的内存区域,以防止写入。在该区域的任何位置写入都会导致分段错误 将声明更改

我在两个不同的编译器上测试了以下代码,它在第一个编译器上崩溃了,但在第二个编译器上运行良好

代码是

char *str="testing";
*str='b';
printf("%c",*str);
输出:在第一个编译器上崩溃 第二个编译器上的
b

崩溃的可能原因是什么?

崩溃的原因是写入字符串文本的内存是未定义的行为。您的代码
*str='b'
直接写入分配给字符串文本的内存的第一个
char
。C允许编译器将文本的内容放入受保护的内存区域,以防止写入。在该区域的任何位置写入都会导致分段错误

将声明更改为

char str[]="testing";

以避免错误。如果将
str
声明为
char
数组(与
char
指针相反),编译器将生成代码,将
str
的内容复制到可写内存中,从而避免在写入字符串文本时发生错误。

这通常具有未定义的行为。

(正如您所看到的,在依赖于系统的基础上),字符串文本被放在只读内存中,然后试图更改它们将导致运行时错误。

但是我声明为
char*
不是
const char*
您的指针类型是
char*
,但它仍然指向常量内存。(通常的解释是写入
char*
而不是
const char*
是错误的。)因为这不是字符串文字。@haccks:那么它是什么?@kevingomes它是一个字符数组。请查看答案的更新。我们如何定义字符串文字?@kevingomes字符串文字是双引号内的字符序列。这是定义它的唯一方法。您可以将其转换为
char
数组,但您可以使用lso将其转换为不可写指针(从某种意义上说,写入该指针是非法的,但编译器无论如何都会允许)。