通过指针更改结构内容

时间:2015-10-03 18:38:48

标签: c pointers data-structures offset

我的结构如下

typedef struct runData{
   byte                 curentCycle = 0;
   sensorData           sensor[8];
}

其中sensorData是以下结构

    typedef struct sensorData{
    float currentValue=NULL;
    float lastValue;
    float maxValue[2] = {-50 ,-50};
    float minValue [2]= {1001,1001};
    byte trend=0;               
    byte mode = 1;              
    sensorSetPoints setPoints[2];   
};

和sensorSetPoints是

typedef struct sensorSetPoints{
  float setPoint;                   
  float rise;                       
  float drop;
};

我按

创建和添加数据
runData     *thisRun;
thisRun->sensor[0].setPoints[0].setPoint = 26.77;

现在我想得到这个值,不是使用结构而是使用偏移指针。我得到了thisRun的地址并为它添加了一个偏移量,这个偏移来自我创建的数组,原理是这是结构中的第11个项目,前面的10个项目(6个浮点数和4个字节)给出了偏移量当我把它添加到thisRun的地址时,我认为我应该有一个指针指向thisRun-> sensor [0] .setPoints [0] .setPoint

因此,如果您同意我的意见,为什么以下不起作用

uint16_t *baseAddress = (uint16_t *)thisRun;
uint16_t offset = readOffset(10);//returns offset
baseAddress += offset;
float *f;
memcpy(f,baseAddress,4);

当我打印f时它是0.00 我错过了什么?

2 个答案:

答案 0 :(得分:1)

在您发布的代码中的许多问题中,这是最严重的问题

float *f;
memcpy(f, baseAddress, 4);

您正在尝试写入未分配的指针。

您甚至没有初始化f,具体取决于您想要的内容

float *f;
f = malloc(sizeof(*f));
if (f != NULL)
    memcpy(f, baseAddress, sizeof(*f));

或可能是

float f;
memcpy(&f, baseAddress, sizeof(*f));

答案 1 :(得分:0)

好的,如果它帮助其他人就是我想做的事情,那么它的关键是使用reinterpret_cast

intptr_t p =(intptr_t)&thisRun;  //Integer type capable of holding object pointer
p += readOffset(10);  //function which determines the offset of, in this case the 10th item
float fval = *reinterpret_cast<float *>(p);//Cast the int back to a pointer