Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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_String - Fatal编程技术网

通过指针更改C中的字符串文字?

通过指针更改C中的字符串文字?,c,string,C,String,可能重复: 我有以下计划: char *s = "abcdf"; char s1[50] = "abcdf"; s1[0] = 'Q'; // Line 1 s[0] = 'P'; // Line 2 为什么第1行工作正常,而第2行导致程序崩溃?第2行指向可执行文件的只读数据部分,而在第1行中,程序使用给定字符串初始化s1数组。这存储在堆栈中,您可以对其进行修改。第2行指向可执行文件的只读数据部分,而在第1行中,程序使用给定字符串初始化s1数组。这存储在堆栈中,您可以对其

可能重复:

我有以下计划:

char *s     = "abcdf";
char s1[50] = "abcdf";

s1[0] = 'Q';   // Line 1
s[0] = 'P';    // Line 2

为什么
第1行
工作正常,而
第2行
导致程序崩溃?

第2行指向可执行文件的只读数据部分,而在第1行中,程序使用给定字符串初始化
s1
数组。这存储在堆栈中,您可以对其进行修改。

第2行指向可执行文件的只读数据部分,而在第1行中,程序使用给定字符串初始化
s1
数组。这存储在堆栈中,您可以对其进行修改

char *s = "abcdf";
char s1[50] = "abcdf";
s1[0] = 'Q'; // Line 1
s[0] = 'P'; // Line 2 
这里,
s
是一个保证可修改的指针,它可以是全局变量或局部堆栈变量,具体取决于您是将该定义放在程序范围内还是放在函数内。在开始使用之前,编译器需要安排将文本“abcdf”的地址加载到
s
中。典型地,在现代操作系统中,“abcdf”本身将位于只读存储器的一个区域中,在该区域中,将程序文件读入存储器以准备执行的“加载器”告诉CPU本身允许读操作,但不允许写操作。因此,
s
(可修改)指向“abcdf”,而“abcdf”不可修改

s1
是保证可修改的50个字符数组。在开始使用之前,编译器需要安排将文本“abcdf”复制到可修改的缓冲区中。然后,您可以像使用
s1[0]=“Q”
一样安全地修改该缓冲区

s[0]=“p”
使用指针
s
在只读内存中查找原始的不可修改/常量文本“abcdf”,然后尝试更改它。如上所述,CPU通常配置为通过生成CPU异常/陷阱/信号/中断(术语因制造商而异)进行反应。你的程序将失败

这里,
s
是一个保证可修改的指针,它可以是全局变量或局部堆栈变量,具体取决于您是将该定义放在程序范围内还是放在函数内。在开始使用之前,编译器需要安排将文本“abcdf”的地址加载到
s
中。典型地,在现代操作系统中,“abcdf”本身将位于只读存储器的一个区域中,在该区域中,将程序文件读入存储器以准备执行的“加载器”告诉CPU本身允许读操作,但不允许写操作。因此,
s
(可修改)指向“abcdf”,而“abcdf”不可修改

s1
是保证可修改的50个字符数组。在开始使用之前,编译器需要安排将文本“abcdf”复制到可修改的缓冲区中。然后,您可以像使用
s1[0]=“Q”
一样安全地修改该缓冲区

s[0]=“p”
使用指针
s
在只读内存中查找原始的不可修改/常量文本“abcdf”,然后尝试更改它。如上所述,CPU通常配置为通过生成CPU异常/陷阱/信号/中断(术语因制造商而异)进行反应。您的程序将失败。

和的可能重复。和的可能重复。