0

我需要将数据写入一个结构,其中数据的长度取决于我要发送到设备的命令。为此,我定义了以下结构:

typedef struct {
    uint8 len;          // Command length (cmd ... crc)
    uint8 cmd;          // Command code
    uint8 data_length;  // Data length
    uint8 data[12];     // Data: max 12 Byte
    uint8 crc_h;        // CRC value MSB
    uint8 crc_l;        // CRC value LSB
}CMD_TYPE;

注意:成员cmd、 *data_length* 和crc始终存在,而成员数据可以为空或最多包含 12 个字节。

我创建了一个函数,它根据传递给函数的参数返回一个初始化的命令:

CMD_TYPE Device::get_cmd(uint8 cmd, uint8 data_len, uint8 *data)
{
    CMD_TYPE cmd;

    cmd.len = (4 + data_len) * sizeof(uint8);
    cmd.cmd = cmd;
    cmd.data_length = data_len;
    cmd.data = (uint8 *)realloc(cmd.data, data_len*sizeof(uint8));
    if(data_len > 0)    memcpy(cmd.data, data, data_len);

    add_crc16((uint8*)&cmd);

    return cmd;
}

函数 get_cmd() 的使用如下:

uint8 cmd_code = 0x01;
uint8 data[2] = {0xAB, 0xCD};

CMD_TYPE cmd = local_device->get_cmd(cmd_code, 2, data);
retVal = local_device->send(cmd);

当我尝试编译此代码时,我从该行的编译器中收到一个错误:

cmd.data = (uint8 *)realloc(cmd.data, data_len*sizeof(uint8));

并且编译器错误是:

error: lvalue required as left operand of assignment

使用realloc()的目的是重新调整数组数据的大小或从我的新命令结构中完全删除它。我的代码有什么问题?这是用动态内存分配初始化结构的正确方法吗?

4

3 回答 3

2

你想要的是臭名昭著的struct hack

typedef struct
{
    uint8   len;          // Command length (cmd ... crc)
    uint8   cmd;          // Command code
    uint8   data_length;  // Data length
    uint8   crc_h;        // CRC value MSB
    uint8   crc_l;        // CRC value LSB
    uint8   data[1];      // Data: max 12 Byte
} CMD_TYPE;

诀窍是为 struct 的所有成员分配足够的空间data[],然后为成员添加足够的字节data[]

CMD_TYPE * allocCmd(int dataSize)
{
    int         len;
    CMD_TYPE *  p;

    len = sizeof(CMD_TYPE) + (dataSize-1)*sizeof(uint8);
    p = (CMD_TYPE *) malloc(len);
    memset(p, 0, len);
    p->data_length = dataSize;
    return p;
}

在这里,len计算为结构的大小,减去空成员的大小,再加上为数组指定的data许多元素。dataSizedata

问题是您必须小心,切勿访问p->data[]超出其中实际分配的任何元素(在结构内部)。

于 2011-09-09T15:07:46.883 回答
1

CMD_TYPE.data是一个数组,而不是一个指针。由于您希望它跟踪动态分配的内存,因此它必须是一个指针:

uint8_t * data;

只是不要忘记用malloc()(或在之前将其设置为零realloc())初始化它并自己清理

顺便说一句,不要结果malloc()与合作。

于 2011-09-09T14:46:20.993 回答
0

定义为 a[..] 的数组是不可变的,您不能为它们分配任何东西。相反,您应该使用指针。

于 2011-09-09T14:42:04.320 回答