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

时间:2015-11-07 22:47:19

标签: c++ segmentation-fault

我有一个我不太懂的段错误。 它出现在这一行:

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时,文本显示正常。

2 个答案:

答案 0 :(得分:3)

如果fps是一个整数,并且一个好的猜测是它在1和100之间,你就是在尝试从该内存地址区域读取数据(直到第一个null为止)被发现)。这将产生一个seg-fault,因为你没有拥有这个记忆。

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

您可能想要做的是 您的整数转换为有效的C-Style字符串(空终止的字符数组),为此您可以使用{ {3}}:

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作为itoa()的建议。

答案 1 :(得分:3)

您似乎正在尝试将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。