gpt4 book ai didi

c - C 中具有动态内存分配的结构

转载 作者:太空宇宙 更新时间:2023-11-04 07:37:59 25 4
gpt4 key购买 nike

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

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 始终存在,而不是成员 data可以为空或最多包含 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() 的目的是重新调整数组数据的大小或将其从我的新命令结构中完全删除。我的代码有什么问题?这是使用动态内存分配初始化结构的正确方法吗?

最佳答案

你想要的是臭名昭著的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;

诀窍是为 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[] 中实际分配的元素之外的任何元素(在结构内部) .

关于c - C 中具有动态内存分配的结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7363348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com