不赞成将字符串文字转换为char*
Conversion from string literal to char* is deprecated
我在代码中不断收到错误"不赞成将字符串文字转换为char*"。该代码的目的是使用指针对指针为字符串1和字符串2分配一个单词,然后将其打印出来。我该怎么解决这个问题?
这是我的代码:
#include <iostream>
using namespace std;
struct WORDBLOCK
{
char* string1;
char* string2;
};
void f3()
{
WORDBLOCK word;
word.string1 = "Test1";
word.string2 = "Test2";
char *test1 = word.string1;
char *test2 = word.string2;
char** teststrings;
teststrings = &test1;
*teststrings = test2;
cout << "The first string is: "
<< teststrings
<< " and your second string is: "
<< *teststrings
<< endl;
}
C++字符串文字是constchar
的数组,这意味着您不能合法地修改它们。
如果要将字符串文本安全地分配给指针(这涉及到隐式数组到指针的转换),则需要将目标指针声明为const char*
,而不仅仅是char*
。
这是一个编译时没有警告的代码版本:
#include <iostream>
using namespace std;
struct WORDBLOCK
{
const char* string1;
const char* string2;
};
void f3()
{
WORDBLOCK word;
word.string1 = "Test1";
word.string2 = "Test2";
const char *test1 = word.string1;
const char *test2 = word.string2;
const char** teststrings;
teststrings = &test1;
*teststrings = test2;
cout << "The first string is: "
<< teststrings
<< " and your second string is: "
<< *teststrings
<< endl;
}
考虑一下如果语言没有施加这个限制会发生什么:
#include <iostream>
int main() {
char *ptr = "some literal"; // This is invalid
*ptr = 'S';
std::cout << ptr << "n";
}
(非const
)char*
允许您修改指针指向的数据。如果您可以将字符串文字(隐式转换为指向字符串第一个字符的指针)分配给纯char*
,则可以使用该指针修改字符串文字,编译器不会发出警告。上面的无效代码,如果有效,将打印
Some literal
--它可能在某些系统上确实如此。不过,在我的系统上,它会因分段故障而死亡,因为它试图写入只读存储器(不是物理ROM,而是操作系统标记为只读的存储器)。
(顺便说一句:C对字符串文字的规则与C++的规则不同。在C中,字符串文字是char
的数组,不是是const char
的数组,但试图修改它会有未定义的行为。这意味着在C中你可以合法地写char *s = "hello"; s[0] = 'H';
,编译器不一定会抱怨,但当你运行程序时,它可能会因分段错误而死亡。)。这样做是为了保持与引入const
关键字之前编写的C代码的向后兼容性。C++从一开始就有const
,所以这种特殊的折衷是没有必要的。)
基本上字符串文字是在只读内存中创建的。如果您试图修改值,则在C.中运行时会出现分段故障
为了在运行时克服这个问题,在C++中,在编译时进行转换检查。
char*n=";字符串";
在C++中,字符串文本到char*的隐式转换是不可能的,因为它在C++中是无效的。如果您正在尝试转换,它将给出编译错误。
如果你想使用
const char*n=";字符串";
- 将无符号char*转换为std::istream*C++
- 为什么这个函数将"const char*"转换为"void* const"而不是"const void*"
- 将函数参数"const char*"转换为"std::string_view"是
- C ++如何在使用"tolower"时将char转换为int
- 有没有办法在C++的赋值中将"char**"转换为"double"?
- JavaCPP 错误:无法将参数"1"的"char*"转换为"Abc*
- 为什么从 char 转换为 std::byte 可能是未定义的行为?
- 如何在虚幻引擎4中将char*转换为TCHAR?
- C++:将模板类型 char 转换为 std::string
- strcmp/char* 转换无法按预期工作
- C++中的SQLite char*转换
- 无法从 const char* 转换为 const char *&
- 在 C++ 中将 char 转换为 int,而无需符号位传播
- 如果必须包含西里尔字符,如何将 char* 转换为 std::string?
- 试图使用strCMP时的char转换错误
- 无法从'const char *'转换为'LPCTSTR'
- 将 std::vector<char> 转换为字符* 会导致字符缺陷
- 使用 static_cast 将 char 转换为 int c++
- 如何在 C++(MFC) 中将 char* 转换为 LPCTSTR
- 无法将const char转换为字符串构造字符串