在C ++中使用char指针中的memset进行分段错误(核心转储)

时间:2017-11-03 21:42:05

标签: c++ segmentation-fault memset

我有两个版本的代码。一个是有效的,另一个则不然。

工作代码如下:

 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)

我无法弄清楚发生了什么。你能帮帮我吗?

2 个答案:

答案 0 :(得分:0)

我认为你有

char *str = "Hello world";
你失败的代码中的

memset失败,因为str是指向常量字符串的指针。您不能更改常量字符串。

在有效的

char str[] = "Hello World";

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

答案 1 :(得分:0)

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

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