我已经定义了一个struct数据并将其分配给char *。但是,strlen函数的大小总是将结果表示为1,cout不显示任何内容。这是我的代码:
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;
}
输出是: 长度: 1
请帮助我理解发生了什么?
答案 0 :(得分:3)
strlen
函数计算传递的字符串中的所有字节,直到找到字符'\0'
。此字符与整数0
相同。
那么对strlen
的调用是在它找到零之前计算字节数,在你的情况下,零恰好在结构二进制表示的第二个字节中,这意味着“字符串长度” “是一个。
您可以从中推断出的唯一一件事就是您使用的是little endian系统。除此之外,调用是未定义的行为,因为“字符串”实际上不是字符串。
答案 1 :(得分:2)
它返回1的原因是因为您将结构视为char数组。执行此操作,您将重新解释结构的内容 - 整数10
,它可能作为字符串存储在内存中0x0A000000
。这会产生1的长度(在数组中的空字符之前只有1个非零值)
答案 2 :(得分: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;
}
为什么 您试图将该结构视为字符串?