【问题标题】:Change string literal in C through pointer? [duplicate]通过指针更改C中的字符串文字? [复制]
【发布时间】:2012-04-18 02:33:07
【问题描述】:

可能重复:
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 导致程序崩溃?

【问题讨论】:

标签: c string


【解决方案1】:

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

【讨论】:

    【解决方案2】:
    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 异常/陷阱/信号/中断来做出反应(术语因制造商而异)。你的程序会失败。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-01
      • 2022-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多