C++ 中 char 指针中的 memset 的分段错误(核心转储)
Segmentation fault (core dumped) with memset in char pointer in C++
我有两个版本的代码。一个有效,另一个无效。
工作代码如下:
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";
在你失败的代码中。 memset
失败,因为 str
是指向常量字符串的指针。不允许更改常量字符串。
有效的
char str[] = "Hello World";
将常量字符串复制到局部变量中。您可以更改它。
你用的是什么编译器?那不应该编译,因为 "Hello World" 是一个 const char[12],它会退化为 const char*。在 C++ 中,将 const char* 分配给 char* 是无效的,因为如果不强制转换就不能丢失 const。修改 const 数据是未定义的行为,因此崩溃是合理的。 (通常字符串文字被放置在只读内存段中,因此如果您写入它们可能会崩溃(但这是编译器细节,而不是语言。))
如果要修改数据,必须将字符串字面量复制到自己的内存中。你的第一个是这样做的有效方法。
我有两个版本的代码。一个有效,另一个无效。
工作代码如下:
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";
在你失败的代码中。 memset
失败,因为 str
是指向常量字符串的指针。不允许更改常量字符串。
有效的
char str[] = "Hello World";
将常量字符串复制到局部变量中。您可以更改它。
你用的是什么编译器?那不应该编译,因为 "Hello World" 是一个 const char[12],它会退化为 const char*。在 C++ 中,将 const char* 分配给 char* 是无效的,因为如果不强制转换就不能丢失 const。修改 const 数据是未定义的行为,因此崩溃是合理的。 (通常字符串文字被放置在只读内存段中,因此如果您写入它们可能会崩溃(但这是编译器细节,而不是语言。))
如果要修改数据,必须将字符串字面量复制到自己的内存中。你的第一个是这样做的有效方法。