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的分段错误(核心转储)[重复]的主要内容,如果未能解决你的问题,请参考以下文章