【问题标题】:Segmentation fault (core dumped) with memset in char pointer in C++ [duplicate]C++中char指针中的memset的分段错误(核心转储)[重复]
【发布时间】:2017-11-03 21:42:04
【问题描述】:

我有两个版本的代码。一个有效,另一个无效。

工作代码如下:

 int main()
    {
        int i;
        char str[] = "Hello World";
        std::cout<<"The string value before memset is : "<<str<<std::endl;
        memset (str,'-',6);
        std::cout<<"The string value after memset is : "<<str<<std::endl;
        return 0;
    }

它给出了预期的输出:

The string value before memset is : Hello World
The string value after memset is : ------World

现在,我有另一个版本的代码,我想在其中使用 char 指针,但这段代码不起作用。我得到以下输出:

int main()
{
    char *str;
    str = "Hello World";
    std::cout<<"The string value before memset is : "<<str<<std::endl;
    memset (str,'-',6);
    std::cout<<"The string value after memset is : "<<str<<std::endl;
    return 0;
}
The string value before memset is : Hello World
Segmentation fault (core dumped)

我只是不知道发生了什么。你能帮我解决这个问题吗?

【问题讨论】:

  • “我有另一个版本的代码” - 给我们看看!
  • 大声笑 - 你展示了有效的代码,而不是失败的代码!
  • 我知道它在说什么 - 它说char *str = "Hello World"
  • 字符串字面量是常量。您不能也不应该修改它们。这就是为什么在声明指向它们的指针时应该始终使用const char*
  • @enjal 那是因为你不应该修改数据!指针指向的文字字符串是 constant.

标签: c++ segmentation-fault memset


【解决方案1】:

你用的是什么编译器?那不应该编译,因为“Hello World”是一个 const char[12],它会衰减为 const char*。在 C++ 中,将 const char* 分配给 char* 是无效的,因为没有强制转换就不能丢失 const。修改 const 数据是未定义的行为,因此崩溃是合理的。 (通常字符串文字被放置在只读内存段中,因此如果您写入它们可能会崩溃(但这是编译器细节,而不是语言。))

如果要修改数据,必须将字符串文字复制到自己的内存中。你的第一个是一种有效的方法。

【讨论】:

    【解决方案2】:

    我猜你有

    char *str = "Hello world";
    

    在您失败的代码中。 memset 失败,因为 str 是指向常量字符串的指针。不允许更改常量字符串。

    在那个有效的地方

    char str[] = "Hello World";
    

    将常量字符串复制到局部变量中。您可以更改它。

    【讨论】:

    • 我必须在指针版本中工作。
    • @enjal :然后“Yousa 搞砸了”,冈根人说。如果不调用未定义行为的怪异行为,就无法写入常量内存。
    • 你的意思是'我必须使用指针'?
    猜你喜欢
    • 2021-05-04
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    • 2023-03-09
    • 1970-01-01
    • 2014-04-11
    • 2017-07-24
    相关资源
    最近更新 更多