C++中char指针中的memset的分段错误(核心转储)[重复]

Posted

技术标签:

【中文标题】C++中char指针中的memset的分段错误(核心转储)[重复]【英文标题】:Segmentation fault (core dumped) with memset in char pointer in C++ [duplicate] 【发布时间】: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. 【参考方案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 搞砸了”,冈根人说。如果不调用未定义行为的怪异行为,就无法写入常量内存。 你的意思是'我必须使用指针'?

以上是关于C++中char指针中的memset的分段错误(核心转储)[重复]的主要内容,如果未能解决你的问题,请参考以下文章

Memset 分段错误

没有指针的 C++ 分段错误 (HackerRank)

使用指向指针 C++ 的指针时出现分段错误

尝试使用指向 char* 的指针时出现总线错误 10 或分段错误 11,具体取决于封装

将指向数组的指针传递给函数时出现分段错误(C++)

将 vector<string> 转换为 char** 会导致分段错误