c - 将 16 位变量存储到取消引用的变量写入 32 位

标签 c reference

考虑以下因素:

// main.h
struct
{
    uint16_t aChargeOption0;
    uint16_t aChargeOption1;
} oBattChargerInfo;

typedef struct CHGRRM
{
    uint16_t nRegIndex;
    uint8_t  nDataType;
    uint32_t nDataWidth;
    uint32_t nRegAddress;
    bool     IsWritable;
    bool     HasBits;
    uint32_t nBitStoreStart;
        uint32_t nBitStoreEnd;
    int  *ptrToData;
} chargerRegMap_t;

extern chargerRegMap_t charger_reg_map[];



// main.c

chargerRegMap_t charger_reg_map[] =
{
  { &oBattChargerInfo.aChargeOption0 },
  { &oBattChargerInfo.aChargeOption1 },
};




// code to store a variable to the de-referenced variable
uint16_t aFinalBuff=0x00;
aFinalBuff=buff[1]<<8;     // buff[0] and buff[1] is uint8 
aFinalBuff=aFinalBuff+buff[0];
*charger_reg_map[nRegIndex].ptrToData=aFinalBuff;

当我存储第一个变量 (charger_reg_map[0].ptrToData,在第一种情况下为 oBattChargerInfo.aChargeOption0) 时,16 位变量会覆盖相邻变量 oBattChargerInfo.aChargeOption1。除了将我的 oBattChargerInfo 结构中的每个变量设置为 32 位之外,还有其他解决方案吗?取消引用的变量会以这种方式工作似乎很奇怪。

我尝试了 *charger_reg_map[nRegIndex].ptrToData=(uint16_t)aFinalBuff; 明确我的意图。没关系。

我在这里做错了什么?

最佳答案

如果您想要不同大小的变量,则没有可以用来写入所有变量的指针类型。

设计有点脆弱,因为您需要知道指针指向哪个成员,或者至少知道它的类型。

我认为更好的选择是通过函数使用 memcpy 进行工作,并向 chargerRegMap_t 添加一个“size”成员以进行完整性检查。

类似于

void write_data(chargerRegMap_t* map, void* data, size_t size)
{
    assert(size == map->data_size);
    memcpy(map->ptrToData, data, size);
}

/* ... */
uint16_t aFinalBuff = 0x00;
aFinalBuff = buff[1] << 8; 
aFinalBuff = aFinalBuff + buff[0];
write_data(charger_reg_map + nRegIndex, &aFinalBuff, sizeof(aFinalBuff));  

我可能还会添加一个宏,以消除 sizeof 拼写错误并使其不那么乏味:

#define WRITE_DATA(map, data) write_data(map, &data, sizeof(data))
/* ... */
WRITE_DATA(charger_reg_map + nRegIndex, aFinalBuff);  

关于c - 将 16 位变量存储到取消引用的变量写入 32 位,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55401872/

相关文章:

c - 使用异步套接字在 C 应用程序中实现加密

c++ - 使用不带括号的 sizeof

c - 如何将 ASCII 码转换成字节码?

.net - DLL不复制到bin文件夹

java - PHP - 如何检查两个引用是否指向同一底层对象(内存地址)?

c++ - 错误 : use of overloaded operator '*' is ambiguous

c - 大小 8 的无效读取 - Valgrind + C

c - 函数内的函数不起作用

c# - C# 教学引用

javascript - JS - 理解闭包