通过属性问题初始化typedef结构

时间:2018-10-09 13:12:19

标签: c++ pointers struct typedef

我基于字节定义了一个结构,大小为3个字节。 (1个packetID和2个packetSize)我使用sizeof函数检查了大小,并且效果很好:

#pragma pack(1)

typedef struct ENVIRONMENT_STRUCT{
    unsigned char packetID[1];
    unsigned char packetSize[2];
}

我创建了一个这样的变量并保留了内存:

ENVIRONMENT_STRUCT * environment_struct = new ENVIRONMENT_STRUCT();

现在我要初始化 environment_struct

问题在于我正试图通过属性初始化此结构,就像这样:

*environment_struct->packetSize = 100;

但是当我检查此值时,使用:

std::cout << "Packet Size: " << environment_struct->packetSize << endl;
  

结果:数据包大小:d

     

预期结果:数据包大小:100

如果我将使用数字,是否应该使用csdint库定义结构?例如,u_int8和这种类型的变量。

4 个答案:

答案 0 :(得分:3)

这样做的时候

ENVIRONMENT_STRUCT * environment_struct = new ENVIRONMENT_STRUCT();

您将packetSize初始化为{0, 0}。然后

*environment_struct->packetSize = 100;

将数组转换为{100, 0}。由于当您使用

将其发送到cout时,该数组是一个字符数组
std::cout << "Packet Size: " << environment_struct->packetSize << endl;

将其视为c字符串并打印出字符串内容。由于您看到d,这意味着您的系统正在使用ascii,因为字符'd'的整数表示为100。要查看100,您需要将其投射到int之类的

std::cout << "Packet Size: " << static_cast<int>(*environment_struct->packetSize) << endl;

请注意,由于packetSize是由两个字符组成的数组,因此您实际上无法分配一个占用整个空间的单个值。如果需要,则需要使用固定宽度类型,例如

typedef struct ENVIRONMENT_STRUCT{
    uint8_t packetID; // unsigned integer that is exactly 8 bits wide.  Will be a compiler error if it does not exist
    uint16_t packetSize; // unsigned integer that is exactly 16 bits wide.  Will be a compiler error if it does not exist
};

int main()
{
    ENVIRONMENT_STRUCT * environment_struct = new ENVIRONMENT_STRUCT();
    environment_struct->packetSize = 100;
    std::cout << "Packet Size: " << environment_struct->packetSize << std::endl;
}

答案 1 :(得分:1)

让我们首先考虑*environment_struct->packetSize = 100;的作用。它将ENVIRONMENT_STRUCT::packetSize的第一个字节设置为100。更常规的语法是:environment_struct->packetSize[0] = 100

实际上,没有任何一种方法可以初始化结构体,以使表达式std::cout << environment_struct->packetSize的输出结果为100。让我们考虑一下这样做的结果。 environment_struct->packetSize是一个数组,在这种情况下,它会衰减为指向第一个元素的指针。插入字符流中的字符指针被解释为以null结尾的字符串。幸运的是,您已经对environment_struct->packetSize的第二个字节进行了值初始化,因此您的数组的确以null结尾。第一个字节的值被解释为编码字符。在系统编码中,d字符被编码为值100。

如果要打印设置为100的environment_struct->packetSize的第一个字节的数值,可以使用:

std::cout << "Packet Size: " << (int)environment_struct->packetSize[0] << endl;

答案 2 :(得分:0)

由于packetSize被声明为char型,因此将其输出为字符。 (字符“ d”的ASCII码为100 ...)

尝试将其转换为整数类型:

std::cout << "Packet Size: " << (int)environment_struct->packetSize << endl;

或者,由于您似乎希望将数字存储为2字节类型,因此可以避免进行此类强制转换,只需将packetSize声明为unsigned shortcout会将其解释为整数类型。

答案 3 :(得分:0)

当您尝试打印字符符号而不是整数时,会得到此结果。

要解决此问题,只需根据需要转换值或将其声明为整数即可。

广播示例:

std::cout << "Packet Size: " << static_cast<int>(*environment_struct->packetSize) << std::endl;