为什么从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?这可不像你想象的那样。我建议你读一本好书中的指针。