为啥从 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&lt;const char *&gt;(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++

在Qt中如何将QString转换为const char*

无法将字符串转换为 const char/string* 到 int*

C++CString转换为const char *类型