OFFSETOF宏结构域

时间:2013-11-08 05:20:37

标签: c macros struct

使用OFFSETOF宏

更新结构字段的代码
#include <stdio.h>   
#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))   

typedef struct PodTag {    
int     i;    
double  d;    
char    c; 
}PodType;   

#pragma pack(1)
int main() 
{    
     char arr[20] = {'\0'};
     arr[0] = 0x1;
     PodType instance;
     printf("%d\n", OFFSETOF(PodType, c));   
     memset(&instance,0,sizeof(PodType)); 
     memcpy(&instance+OFFSETOF(PodType, c),&arr[0],sizeof(char));
     printf("Val of C = %d\n",instance.c); // value is not reflected
     getchar();    
return 0; 
} 

我在这里做memcpy。价值没有反映出来。什么是错的

memcpy(&instance+OFFSETOF(PodType, c),&arr[0],sizeof(unsigned char));

我们可以做这样的事情来更新结构字段

#define OFFSETOF_DATA(TYPE, ELEMENT,data) \
  (*((size_t)&(((TYPE *)0)->ELEMENT)) = (unsigned char)(data))  

2 个答案:

答案 0 :(得分:2)

这条线路造成了麻烦:

 memcpy(&instance+OFFSETOF(PodType, c),&arr[0],sizeof(char));

它将&instance视为数组的开头,并向其中添加一个16等数字,从而访问虚构数组的第16个成员的i元素。

您需要使用:

 memcpy((char *)&instance+OFFSETOF(PodType, c), &arr[0], sizeof(char));

这会将正确的字节数添加到&instance的字节地址中。请注意,char *强制转换与cchar字段的事实无关;即使您正在访问char *i元素,您仍然会使用d广告。

#include <stdio.h>
#include <string.h>

#define OFFSETOF(TYPE, ELEMENT) ((size_t)&(((TYPE *)0)->ELEMENT))

typedef struct PodTag
{
    int i;
    double d;
    char c;
} PodType;

int main(void)
{
    char arr[20] = {'\0'};
    arr[0] = 0x1;
    PodType instance;
    printf("%zu\n", OFFSETOF(PodType, c));
    memset(&instance, 0, sizeof(PodType));
    memcpy((char *)&instance+OFFSETOF(PodType, c), &arr[0], sizeof(char));
    printf("Val of C = %d\n", instance.c);
    return 0;
}

示例输出(Mac OS X 10.9 Mavericks; GCC 4.8.2,64位编译):

16
Val of C = 1

答案 1 :(得分:0)

(TYPE*)0&LT;&LT;将是一个NULL指针。