c - 使用指针和 offsetof() 访问结构的正确方法是什么

标签 c struct offsetof

我有以下代码,以便能够访问结构数组中的多个字段(为简单起见,我已将其减少为两个)。最终指针计算的正确咒语是什么 *(ptr + offset) = 数据; 因为我总是得到:

错误:从类型“int32_t”{aka“int”分配给类型“struct osc_in_data”时类型不兼容

#define NumHarmonics   10

int32_t data1;
int32_t data2;



struct osc_in_data                                                           
{
    int32_t     LevelAttackRate;                                                
    int64_t     LevelPeakLevel;                                                 
    int32_t     LevelDecayRate;                                                 
} OscControl[NumHarmonics];



void SetADSRvalues(int32_t offset, int32_t data)
{
    int32_t harmonic;
    struct osc_in_data *ptr;
    for (harmonic = 0; harmonic < NumHarmonics; harmonic++)
    {
       ptr = &OscControl[harmonic];
       *(ptr + offset) = data;
    }
} 


SetADSRvalues(offsetof(struct osc_in_data, LevelAttackRate), data1)
SetADSRvalues(offsetof(struct osc_in_data, LevelDecayRate), data2)

最佳答案

offsetoff 函数告诉您同一结构内 2 个内存地址之间的字节距离。

用下面的代码告诉你,

   *(ptr + offset) = data;

struct osc_in_data指针进行指针运算,与ptr[offset] = data;相同

相反,您可以尝试的是。

memcpy((char *)ptr + offset, data, sizeof data);

关于c - 使用指针和 offsetof() 访问结构的正确方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58623573/

相关文章:

c - 我怎样才能在 C 中获得一个进程句柄而不是它的名字?

c - 如何在 Perl 中有效解析表达式 '^#[0-9A-F]{2}\$[0-9A-F]{4}/$'

c# - 是否可以从 List<T> 访问结构体的引用来进行更改?

c - 如何修复 "HDF5-DIAG: Error unable to open file"?

c - 指向多维数组的指针

c - (C) 从文本文件读取结构

c++ - boost fusion 类型 offsetof

c - c struct-embedded union 中的成员对齐

c++ - 为什么 offsetof 实现在 C 和 C++ 上有奇怪的不同?

c - 从 C 中的一行读取单独的数字