为什么从int到const char*的集中会破坏C++; 最近我在VisualStudio中学习C++时,我想用我的方法记录一个int,我需要把它转换成const char *,但是当我做它的时候,崩溃只是我的代码: #include <iostream> #include <math.h> #include <Windows.h> using namespace std; double pi = 3.14159265358979323846; class Log { int level = 1; public: void set_Level(const char* lvl) { if (lvl == "LOW") { level = 1; } else if (lvl == "NORMAL") { level = 2; } else if (lvl == "HIGH") { level = 3; } else { level = 1; } } void Error(const char* message) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x04); cout << "[ERROR]: " << message << endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x0F); } void Warning(const char* message) { if (level != 3) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x06); cout << "[WARNING]: " << message << endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x0F); } } void Info (const char* message) { if (level == 1) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x03); cout << "[INFO]: " << message << endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x0F); } } }; int main() { Log log; log.set_Level("LOW"); int x = 10; log.Info( (const char*) x); } #包括 #包括 #包括 使用名称空间std; 双pi=3.14159265358979323846; 类日志{ 智力水平=1; 公众: 无效集\u级别(常量字符*lvl) { 如果(lvl=“低”) { 级别=1; } 否则如果(lvl=“正常”) { 级别=2; } 否则,如果(lvl=“高”) { 级别=3; } 其他的 { 级别=1; } } 无效错误(常量字符*消息) { SetConsoleTextAttribute(GetStdHandle(标准输出句柄),0x04); cout
将为什么从int到const char*的集中会破坏C++; 最近我在VisualStudio中学习C++时,我想用我的方法记录一个int,我需要把它转换成const char *,但是当我做它的时候,崩溃只是我的代码: #include <iostream> #include <math.h> #include <Windows.h> using namespace std; double pi = 3.14159265358979323846; class Log { int level = 1; public: void set_Level(const char* lvl) { if (lvl == "LOW") { level = 1; } else if (lvl == "NORMAL") { level = 2; } else if (lvl == "HIGH") { level = 3; } else { level = 1; } } void Error(const char* message) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x04); cout << "[ERROR]: " << message << endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x0F); } void Warning(const char* message) { if (level != 3) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x06); cout << "[WARNING]: " << message << endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x0F); } } void Info (const char* message) { if (level == 1) { SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x03); cout << "[INFO]: " << message << endl; SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0x0F); } } }; int main() { Log log; log.set_Level("LOW"); int x = 10; log.Info( (const char*) x); } #包括 #包括 #包括 使用名称空间std; 双pi=3.14159265358979323846; 类日志{ 智力水平=1; 公众: 无效集\u级别(常量字符*lvl) { 如果(lvl=“低”) { 级别=1; } 否则如果(lvl=“正常”) { 级别=2; } 否则,如果(lvl=“高”) { 级别=3; } 其他的 { 级别=1; } } 无效错误(常量字符*消息) { SetConsoleTextAttribute(GetStdHandle(标准输出句柄),0x04); cout,c++,compiler-errors,C++,Compiler Errors,将int强制转换为const char*是不安全的 我会这么做 std::string s = std::to_string(x); log.info(s.c_str()); 或 std::ostringstream oss; oss将int强制转换为const char*是不安全的 我会这么做 std::string s = std::to_string(x); log.info(s.c_str()); 或 std::ostringstream oss; oss“hi”是以null结尾的字
int
强制转换为const char*
是不安全的
我会这么做
std::string s = std::to_string(x);
log.info(s.c_str());
或
std::ostringstream oss;
oss将int
强制转换为const char*
是不安全的
我会这么做
std::string s = std::to_string(x);
log.info(s.c_str());
或
std::ostringstream oss;
oss“hi”
是以null结尾的字符串文字。int x
不是
当您(错误地)将int x
强制转换为const char*
时,您告诉编译器,这里有一个指向连续字节集的指针,该字节集在序列的末尾有一个空终止字符。当然,int
不是指针-因此它的值10
可能是一个无效的起始地址(而且,这很可能会导致SEG错误)。即使它是有效的,它也会指向“任意”的地址。C++允许你在你像你那样抛出的时候做这个转换,但是你不应该这样做。
使用static\u cast(x)
,然后您应该会收到一条编译器警告,警告您:
下面是从编译器中得到的错误:
<source>: In function 'int main()':
<source>:13:10: error: invalid 'static_cast' from type 'int' to type 'const char*'
13 | xxxx(static_cast<const char *>(x));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
ASM generation compiler returned: 1
:在函数“int main()”中:
:13:10:错误:从类型“int”到类型“const char*”的“static_cast”无效
13 | xxxx(静态铸造(x));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
ASM生成编译器返回:1
“hi”
是以null结尾的字符串文字。int x
不是
当您(错误地)将int x
强制转换为const char*
时,您告诉编译器,这里有一个指向连续字节集的指针,该字节集在序列的末尾有一个空终止字符。当然,int
不是指针-因此它的值10
可能是一个无效的起始地址(而且,这很可能会导致SEG错误)。即使它是有效的,它也会指向“任意”的地址。C++允许你在你像你那样抛出的时候做这个转换,但是你不应该这样做。
使用static\u cast(x)
,然后您应该会收到一条编译器警告,警告您:
下面是从编译器中得到的错误:
<source>: In function 'int main()':
<source>:13:10: error: invalid 'static_cast' from type 'int' to type 'const char*'
13 | xxxx(static_cast<const char *>(x));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
ASM generation compiler returned: 1
:在函数“int main()”中:
:13:10:错误:从类型“int”到类型“const char*”的“static_cast”无效
13 | xxxx(静态铸造(x));
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
ASM生成编译器返回:1
char*
是一种指针类型,将地址存储为其值。当您将10
转换为const char*
时,这表示地址值10
,可能无法访问,并导致崩溃和分段错误
您需要做的是使用itoa
函数将10
转换为C样式字符串。char*
是一种指针类型,并将地址存储为其值。当您将10
转换为const char*
时,这表示10
的地址值,这可能无法访问并导致崩溃和丢失分段错误
您需要做的是使用itoa
函数将10
转换为C风格字符串。您期望发生什么?您碰巧有JavaScript背景吗?这与您认为的不一样。我建议您阅读一本好书中的指针。您期望发生什么?您碰巧有JavaScript bac吗kground?这可不像你想象的那样。我建议你读一本好书中的指针。