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

时间:2012-04-18 02:33:07

标签: c string

  

可能重复:
  Why do I get a segmentation fault when writing to a string?

我有以下程序:

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

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

为什么Line 1正常工作且Line 2导致程序崩溃?

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

char *s = "abcdf";
char s1[50] = "abcdf";
s1[0] = 'Q'; // Line 1
s[0] = 'P'; // Line 2 

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

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

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