本文主要是介绍sscanf的用法误区 导致越界访问,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
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字节对齐,要自己做下处理,这个网上有代码,就不列出来了。
这篇关于sscanf的用法误区 导致越界访问的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!