struct DATA
{
BYTE a;
BYTE b;
BYTE c;
BYTE d;
};
char *str = "fd";
DATA data;
sscanf(str, "%02x", &data.a);
乍一看,程序没有什么毛病,笔者测试发现,上面这段程序实际上已经导致结构体变量b,c,d都被操作赋值了。
原因在于sscanf的参数为"%d" "%x"的时候,会认为传入的地址值为一个整型变量,在VS编译器上是4个字节,
就是说本意只对变量a操作,但是污染了变量b,c,d。
正确的做法是
char *str = "fd";
DATA data;
int tmp = 0;
sscanf(str, "%02x", &tmp );
data.a = (BYTE )tmp ; //这里显示表示整型截断转为字节,
推荐十六进制转换使用strtoul
还有结构体使用的时候,也要注意自己对齐的问题,VS编译器默认对齐是4字节。
如果程序需要结构体按1字节对齐,要自己做下处理,这个网上有代码,就不列出来了。