为啥从 int 到 const char* 的转换会破坏 C++ [重复]
Posted
技术标签:
【中文标题】为啥从 int 到 const char* 的转换会破坏 C++ [重复]【英文标题】:why does concersion from int to const char* break C++ [duplicate]为什么从 int 到 const char* 的转换会破坏 C++ [重复] 【发布时间】:2021-05-17 04:35:25 【问题描述】:嗨,最近我在 Visual Studio 中学习 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);
它出错并弹出一个页面说:
它不是我的课,因为如果我运行 log.Info("hi");
它就可以了!
【问题讨论】:
您期望发生什么?你碰巧有 javascript 背景吗? 这并不像你认为的那样。我建议在一本好书中阅读有关指针的内容。 【参考方案1】:"hi"
是一个以空字符结尾的字符串文字。 int x
不是。
当您将(错误地)int x
转换为 const char *
时,您是在告诉编译器,这是一个指向在序列末尾具有空终止字符的连续字节集的指针。当然,int
不是一个指针——所以它的值10
可能是一个无效的起始地址(仅此一项就很可能导致段错误)。即使它是有效的,它也会“指向”某个“任意”地址。 C++ 允许您在按原样进行转换时进行这种转换 - 但您不应该像这样进行转换。
使用static_cast<const char *>(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
【讨论】:
【参考方案2】:将int
转换为const char *
是不安全的。
我会这样做
std::string s = std::to_string(x);
log.info(s.c_str());
或
std::ostringstream oss;
oss << x;
log.Info(oss.str().c_str());
【讨论】:
【参考方案3】:char*
是指针类型并将地址存储为其值。当您将 10
转换为 const char*
时。这表示地址值为10
,可能无法访问并导致崩溃和分段错误。
您需要做的是使用itoa
函数将10
转换为C 风格的字符串。
【讨论】:
以上是关于为啥从 int 到 const char* 的转换会破坏 C++ [重复]的主要内容,如果未能解决你的问题,请参考以下文章
从 'int' 到 'const char*' 的无效转换 [-fpermissive]| (初学者)
boost::variant - 为啥“const char*”转换为“bool”?
如何从 const char* 转换为 unsigned int c++