gpt4 book ai didi

c - 使用 void 指针和计算的偏移量为结构成员赋值

转载 作者:太空宇宙 更新时间:2023-11-03 23:53:03 25 4
gpt4 key购买 nike

我正在尝试将值分配给接受 void * 作为参数的函数中的结构成员,然后根据为结构成员计算的偏移量填充数据值。

 typedef struct
{
char C_BFR_LINK[1];
char C_TABLE_DATA[1];
double MF_COD_BALANCE;
char C_TYPE_DT[1];
}ANS;

函数

void fillin( void *pp)  
{

double* FVAR;
char* CVAR;
CVAR = pp;
memcpy(CVAR,"I",1);
CVAR = (void *)(pp + 1);
memcpy(CVAR,"S",1);
FVAR = (void *)(pp + 2);
*FVAR = 234.96;
CVAR = (void *) (pp + 10);
memcpy(CVAR,"Z",1);
return ;
}

负责填写相应偏移量 1、2 和 10 处的值。

我在 main 中调用这个函数,如下所示
**

int main()  
{
void* p ;
ANS ans;
fillin(&ans);
return 0;
}

**

我使用 gdb 进行调试,在函数 fillin 中,值被分配给成员,但是一旦 control 进入主程序,double 值就会丢失 并且这是不合适的。

(gdb) p pp
$1 = (void *) 0xffffdabc
(gdb) x /c 0xffffdabc
0xffffdabc: 73 'I'
(gdb) x /c 0xffffdabd
0xffffdabd: 83 'S'
(gdb) n
32 *FVAR = 234.96;
(gdb) n
33 CVAR = (void *) (pp + 10);
(gdb) **x /f 0xffffdabe**
0xffffdabe: 234.96000000000001
57 return 0;
(gdb) **p ans**
$2 = {C_BFR_LINK = "I", C_TABLE_DATA = "S",
**MF_COD_BALANCE = 1.9876540305898699e-268**, C_TYPE_DT = "\213"}

谁能帮帮我?此代码是使用 gcc 4.4.6 20120305 构建的。非常感谢任何指示或帮助。

最佳答案

正如其他人已经提到的,这是一个非常糟糕的主意,但是,如果您打包结构以避免填充并使用 char *sizeof(),您可能能够摆脱它,例如:

typedef struct {
char C_BFR_LINK[1];
char C_TABLE_DATA[1];
double MF_COD_BALANCE;
char C_TYPE_DT[1];
}__attribute__((__packed__)) ANS;

void fillin( void *pp)
{
char* CVAR = pp;
double FVAR = 234.96;
/* sizeof(char) is always one */
memcpy(CVAR, "I", sizeof(char));
CVAR += sizeof(char);
memcpy(CVAR, "S", sizeof(char));
CVAR += sizeof(char);
memcpy(CVAR, &FVAR, sizeof(double));
CVAR += sizeof(double);
memcpy(CVAR,"Z",1);
}
int main()
{
ANS ans;
fillin(&ans);
printf("%c\n", ans.C_BFR_LINK[0]);
printf("%c\n", ans.C_TABLE_DATA[0]);
printf("%c\n", ans.C_TYPE_DT[0]);
printf("%f\n", ans.MF_COD_BALANCE);
return 0;
}

这打印:

I
S
Z
234.960000

注意:这不适用于不支持未对齐内存访问的体系结构,以及我不知道的其他可能问题,因此,一种更便携的方法是让编译器填充结构并按照其他答案的建议使用 offsetof 宏,它计算成员从结构开头的偏移量,例如:

#define offsetof(type, member)  __builtin_offsetof (type, member)
CVAR + offsetof(ANS, C_BFR_LINK); //evaluates to 0
CVAR + offsetof(ANS, C_TABLE_DATA); //evaluates to 1
CVAR + offsetof(ANS, MF_COD_BALANCE); //evaluates to 8
CVAR + offsetof(ANS, C_TYPE_DT); //evaluates to 16

关于c - 使用 void 指针和计算的偏移量为结构成员赋值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14935403/

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