【问题标题】:Why does this results in a segmentation fault? [duplicate]为什么这会导致分段错误? [复制]
【发布时间】:2020-03-01 07:57:00
【问题描述】:
int main()
{
    char *p = "I like C++";
    strcpy(p, "John Smith");
    std::cout << p << std::endl;
    EXIT_SUCCESS;
}

如题,为什么会导致分段错误

【问题讨论】:

  • 网站上应该有类似的问题和答案。我会努力寻找他们。它的要点是“我喜欢 C++”是一个字符串文字(它是常量),p 指向它。尝试修改它是未定义的行为,因此会崩溃。如果你想要一个可以修改的字符数组,你想将它声明为char p[] = "I like C++";
  • 因为除了奇怪和不稳定的操作系统之外,您无法修改 String-Literal
  • 这能回答你的问题吗? can't modify char* - Memory access violation
  • 这段代码格式不正确;如果您没有看到编译错误,请调整编译器设置,因为您正在浪费时间尝试运行非法代码

标签: c++


【解决方案1】:

按照strcpy() documentation 使用的术语,您正在尝试将“John Smith”(source 参数)复制到 pdestination 参数)中。

虽然pchar * 类型的指针,但它驻留在只读数据部分(可能是.rodata)。

尝试将新字符串复制到其中,意味着尝试覆盖只读内存。

将声明更改为char p[] = "I like C++"; 解决了这个问题,因为p 现在驻留在可读和可写内存的stach 上。

顺便说一句,最后一行缺少return,应该是return EXIT_SUCCESS

【讨论】:

    猜你喜欢
    • 2016-09-24
    • 2021-11-06
    • 2017-08-18
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 2011-03-16
    相关资源
    最近更新 更多