C++ C+中字符指针中的memset出现分段错误(内核转储)+;
我有两个版本的代码。一个有效,另一个无效 工作守则如下:C++ C+中字符指针中的memset出现分段错误(内核转储)+;,c++,segmentation-fault,memset,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 s
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;
}
现在,我有另一个版本的代码,我想在其中使用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)
intmain()
{
char*str;
str=“你好,世界”;
std::cout我想你有
char *str = "Hello world";
在失败的代码中。memset
失败,因为str
是指向常量字符串的指针。不允许更改常量字符串
在一个有效的
char str[] = "Hello World";
将常量字符串复制到局部变量中。您可以更改它。您使用的编译器是什么?不应该编译,因为“Hello World”是常量字符[12]在C++中,将conchchar *分配给char是无效的,因为在没有抛出的情况下,你不能失去const。修改const数据是未定义的行为,所以崩溃是合理的。(通常字符串文字被放置在只读内存段中,所以如果你给它写,它可能会崩溃。(但这是编译器的细节,不是语言。)
如果要修改数据,必须将字符串文本复制到自己的内存中。第一种方法是有效的。“我有另一个版本的代码”-演示给我们看!lol-您演示了有效的代码,但没有显示失败的代码!我知道它是怎么说的,它说的是char*str=“Hello World”
String文本是常量。您不能也不应该修改它们。这就是为什么在声明指向它们的指针时应该始终使用const char*
。@enjal这是因为您不应该修改数据!指针指向的文本字符串是常量。我必须使用指针版本。@enjal:那么“你搞砸了,”冈根引用道。你不可能在不调用未定义行为的坏怪癖的情况下写入常量内存。你说的“我必须使用指针一号”是什么意思?
char str[] = "Hello World";