gpt4 book ai didi

c - OFFSETOF 宏结构字段

转载 作者:太空宇宙 更新时间:2023-11-04 08:50:26 26 4
gpt4 key购买 nike

使用 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 。该值不反射(reflect)。怎么了

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

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

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

最佳答案

这条线引起了麻烦:

 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 字段这一事实无关;即使您正在访问 id 元素,您仍然会在那里使用 char * 强制转换。

#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

关于c - OFFSETOF 宏结构字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19852136/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com