在开发的过程中,有如下的代码:
unsigned char macAddr1[6] = {0};
unsigned char macAddr2[6] = {0};
......
for(index = 0; index < KEY_LEN_MAC;)
{
......
sscanf(macTmp, "%x", &macAddr1[iMac]);
macAddr2[iMac] = macAddr1[iMac];
......
就是把 macTmp 中的数据,按照 "%x" 格式提取到 macAddr1[] 中;
//========================================================================
在测试的过程中,发现 for() 循环操作完之后;
macAddr2[0] 元素的数据自动被修改了;
但是,我们并没有在代码中手动修改这个元素的值;
//========================================================================
那么,自己推理,macAddr1[], macAddr2[] 元素定义在一起,而且容量小;
那么,编译器为其分配空间的时候,就是一串连续的内存块;
其中,macAddr2 元素接在 macAddr1 之后,例如:
0, 1, 2, 3, 4, 5, 0, 1, 2, 3, 4, 5
--- macAddr1 --- --- macAddr2 ---
那么,macAddr2[0] 元素就接在 macAddr1[5] 元素之后;
//========================================================================
所以,自己推理 sscanf() 函数在操作 macAddr1[5] 元素的时候,编译器在为 macAddr1[5] 元素赋值的时候,修改到了 macAddr2[0] 元素;
所以,有如下的测试例子:
//========================================================================
给 buf[] 数组初始化为 0xee 数值,然后,把 "f5" 字符串通过 sscanf() 函数提取出来;
填充到 buf[0] 元素中;
最终,打印 buf[] 数组,可以看到影响了 buf[1], buf[2] 等元素;
int main(void){
char *p = "f5";
unsigned char buf[8] = {0};
memset(buf, 0xee, 8);
sscanf(p, "%x", buf);
int i;
for(i = 0; i < 8; i++)
{
printf("buf[%d]=%.2x\n", i, buf[i]);
}
printf("\n");
printf("hehe ...\n");
return 0;
}
运行结果如下:
[openwrt@localhost64 test]$ gcc test1.c -o out
[openwrt@localhost64 test]$ ./out
buf[0]=f5
buf[1]=00
buf[2]=00
buf[3]=00
buf[4]=ee
buf[5]=ee
buf[6]=ee
buf[7]=ee
hehe ...
//========================================================================
只需要99元就可以投资自己,掌握Linux系统编程!主要传授《Linux C/C++程序设计》《Linux 系统编程》,主页有学习视频!
只需要99元就拥有全部课程和资料,让我们用技术改变自己,改变生活,改变世界!
视频可以百度搜索:韦凯峰Linux编程学堂