尝试将int转换为const char时出现分段错误

Segmentation fault when trying to convert int to const char

本文关键字:分段 错误 char const int 转换      更新时间:2023-10-16

我有一个seg错误,我真的不明白。它发生在这一行:

int j = strlen(msg);

有人知道为什么会发生这种事吗?

发生的功能:

void Text::displayText( float x, float y, int r, int g, int b, const char * msg){
    int j = strlen(msg);
    glColor3f( r, g, b );
    glRasterPos2f( x, y );
    for( int i = 0; i < j; i++ ) {
        glutBitmapCharacter( GLUT_BITMAP_TIMES_ROMAN_24, msg[i] );
    }
}

如何调用函数(fps是整数):

text.displayText(3.1f,2.7f,255,255,255,(char*)fps);

当我只将msg参数设置为char时,文本显示工作正常。

如果fps是一个整数,并且很好的猜测是它在1到100之间,那么您正试图从该内存地址区域读取数据(直到找到第一个null)。这将创建一个seg错误,因为您不拥有此内存。

这就是为什么进行类型转换通常是个坏主意(除非你真的知道自己在做什么,否则无法解决它)。它告诉编译器"我知道我在做什么,所以不要试图在这里帮助我"——在这种情况下,这是错误的。

您可能想要做的是您的interger转换为有效的C样式字符串(以null结尾的字符数组),为此您可以使用itoa():

char sFPS[20];
text.displayText(3.1f,2.7f,255,255,255,itoa(fps, sFPS, 10));

对于保持原始displayText功能不变的兼容解决方案:

char sFPS[20];
sprintf(sFPS, "%d", fps);
text.displayText(3.1f,2.7f,255,255,255,sFPS);

或者,使用天顶建议的std::string

您似乎正在尝试将int转换为字符串。

如果是这种情况,那么使用std::string,而不是char*:

void Text::displayText(..., const std::string& msg)

要将int转换为std::string,请使用std::to_string:

text.displayText(3.1f, 2.7f, 255, 255, 255, std::to_string(fps));

注意:std::to_string在旧版本的C++中不存在,您至少需要C++11。