当前位置:  开发笔记 > 编程语言 > 正文

为什么这个简单的字符串赋值是segfault?

如何解决《为什么这个简单的字符串赋值是segfault?》经验,为你挑选了2个好方法。

我有以下代码:

#include 
using namespace std;
int main()
{
    char* a = "foo";
    char* b = "bar";
    a = b;
    cout << a << ", " << b << endl;
    return 0;
}

这编译和工作,即.打印bar, bar.现在我想证明这里发生的事情不是复制字符串.我想改变b并表明a也有变化.我想出了这个简单的代码:

#include 
using namespace std;
int main()
{
    char* a = "foo";
    char* b = "bar";
    a = b;
    b[1] = 'u'; // ? just this line added
    cout << a << ", " << b << endl;
    return 0;
}

......但它是段错误的.为什么?有趣的是,以下修改运行得很好:

#include 
using namespace std;
int main()
{
    char* a = "foo";
    char b[] = "bar"; // ? declaration changed here
    a = b;
    b[1] = 'u';
    cout << a << ", " << b << endl;
    return 0;
}

为什么它不像前一个那样段错?我想我错过了指针式和数组式字符串初始化之间的一些重要区别.



1> unwind..:

您不能更改字符串常量,这是您在第一个代码示例中使用指向文字的语法时获得的.

另请参阅此问题:在静态内存中创建的c ++中的字符串文字是什么?.



2> 小智..:

当你写这个:

char *b = "bar";

编译器分配一个匿名(无名)内存区域来存储字符串文字"bar".字符串文字可能不会被修改,因此编译器(在链接器和操作系统的帮助下)将字符串文字放在正在运行的程序的写保护内存空间的一部分中.当您尝试修改它时,操作系统会捕获它并导致程序出现分段错误.

(你的代码是C++,而不是C,但这与这个问题无关.)

推荐阅读
惬听风吟jyy_802
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有