将位域转换为字符串C ++

时间:2015-02-19 11:59:27

标签: c++ nullpointerexception converter bit-fields

我想将位域转换为字符串。 Visual Studio 2008提供了无效的空指针异常。

也许它与数组的大小有关。它必须是8但输出结果是4,但为什么呢?

class Converter
{
public:
    string bitfieldToString (bool b_input[])
    {
        string c_conv;
        int i;
        for(i = 0; i < sizeof(b_input) ; i++)
        {
            if(b_input[i]=false){
                c_conv.append("0");
            }
            else if (b_input[i]=true){
                c_conv.append("1");
            }
            else c_conv = "Input is not a bitfield";break;
        }
        cout<<c_conv<<" "<< sizeof(b_input)<<endl;
        return (0);
    }
};
int main(void)
{
    Converter converter;
    bool b2[8] = {0,1,0,0,1,0,1,1};
    converter.bitfieldToString(b2);
    return (0);
}

谢谢! 现在一切都按预期工作了。 抱歉转储问题。我是C ++的新手。

2 个答案:

答案 0 :(得分:2)

您的代码中存在 lot 错误。

首先,空指针异常来自return (0);函数末尾的bitfieldToString。您已将其定义为返回string;当你return 0时,C ++认为0是一个char*指针,并试图将它 - NULL指针 - 转换为一个字符串,它将崩溃。您可能应该返回c_conv

其次,sizeof(b_input)将始终是bool指针的大小。在32位系统上,它将是4位,在64位系统上8.您无法获得作为参数传递的数组的长度sizeof;您需要在函数中添加一个长度参数。

第三,在for循环中,您分配给b_input[i]而不是比较值。使用==,而不是=

第四,在最后一个else分支中,你缺少大括号。从本质上讲,break总是会在第一次迭代后突破循环。

答案 1 :(得分:2)

例外是因为你return (0);。这被解释为空指针,用于使用构造函数初始化std::string,该构造函数需要指向C风格字符串的有效指针 - 而不是空指针。

那应该是return c_conv;

尺寸不匹配是因为b_input不是数组。作为函数参数,bool b_input[]是一个指针。您无法按值将数组传递给函数;并且无法仅从指针确定数组大小。所以sizeof(b_input)给出了指针的大小,而不是数组,并且一切都出错了。

有几个选择。您可以将大小作为第二个参数传递;但这很容易出错。您可以通过引用数组来推断大小作为模板参数:

template <size_t size>
string bitfieldToString (bool (&b_input)[size])

您可以使用std::arraystd::vector,它们具有便捷的size()成员函数。 (但请注意vector<bool>,因为它是一种特殊情况,并不总是表现得像标准容器。)或者您可以使用std::bitset,它有一个方便to_string 1}}完全符合你想要的功能。

最后,启用编译器的警告 - 它应该告诉您不要将=用于==。并且没有太多的要点检查布尔值既不是真也不是假的情况。您可以将整个循环体缩小为

c_conv.append(b_input[i] ? '1' : '0');