使用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))
答案 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 *
强制转换与c
是char
字段的事实无关;即使您正在访问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指针。