2013-07-08 52 views
-3

我已经定义了一个结构数据,并将其分配给一个char *。然而,strlen函数的大小总是给出结果为1,并且cout不显示任何内容。这里是我的代码:无法理解结构为char *转换

struct data 
    { 
     int x; 
     int y; 
    }; 
    int main() 
    { 
     data d; 
     d.x = 10; 
     d.y = 20; 
     char *ch = (char*)&d; 
     cout <<"Length:" strlen(ch) << endl; 
     cout << ch << endl; 

    } 

输出是: 长度:

请帮我理解这是怎么回事?

+2

不要严格对待类型系统。它对你做了什么? –

+2

这是什么目的?你是否试图从结构中获得一个字符串?请解释目标是什么,我们可以更好地帮助您实现这一目标。我建议你阅读[XY问题](http://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。 –

回答

3

strlen函数计算传递的字符串中的所有字节,直到找到字符'\0'。该字符与整数0相同。

那么调用strlen被计数的字节数,直到它找到一个零,而在你的情况下,零恰好是在结构二进制表示的第二个字节,这意味着“字符串长度”是一个。

,你可以从这个推断的唯一的事情是,你是一个little endian系统。除此之外,电话是未定义的行为作为“字符串”实际上不是一个字符串。

2

它返回1的原因是因为你是治疗的结构作为一个字符数组。这样做,你的重新演绎结构的内容 - 整数10,这可能是存储在内存中的0x0A000000 - 作为一个字符串。这可产生1的长度(只有1个非零值阵列中的空字符之前)

0

即使你试图把东西作为一个字符串,它不是一个字符串,如果你想要的要做的就是打印出结构中的值,你可以这样做:

struct data 
{ 
    int x; 
    int y; 
}; 
int main() 
{ 
    data d; 
    d.x = 10; 
    d.y = 20; 
    cout << "x is " << d.x << ", y is " << d.y << endl; 

} 

为什么你想治疗该结构作为一个字符串?