【问题标题】:Unable to understand struct to char* conversion [closed]无法理解 struct 到 char* 的转换 [关闭]
【发布时间】:2013-07-05 22:53:17
【问题描述】:

我已经定义了一个结构数据并将其分配给一个 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

请帮助我了解发生了什么?

【问题讨论】:

  • 不要把类型系统看得太差。它对你做了什么?
  • 这样做的目的是什么?您是否试图以某种方式从结构中获取字符串?请说明目标是什么,我们可以更好地帮助您实现该目标。我建议您阅读XY problem

标签: c++ struct char


【解决方案1】:

即使您尝试将某些内容视为不是字符串的字符串,如果您只想打印出结构中的值,您也可以执行以下操作:

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;

}

为什么你试图将该结构视为一个字符串?

【讨论】:

    【解决方案2】:

    它返回 1 的原因是因为您将结构视为 char 数组。这样做你是在重新解释结构的内容——整数10,它可能作为0x0A000000存储在内存中——作为一个字符串。这会产生 1 的长度(在数组中的空字符之前只有 1 个非零值)

    【讨论】:

      【解决方案3】:

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

      所以对strlen 的调用是计算字节数,直到找到零,在您的情况下,零恰好在结构二进制表示的第二个字节中,这意味着“字符串长度”是一个。

      您可以从中推断出的唯一一件事是您在little endian 系统上。除此之外,调用是未定义的行为,因为“字符串”实际上不是字符串。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-10-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多