- 论坛徽章:
- 0
|
原帖由 icestare 于 2006-5-16 10:43 发表
或者改成这样
- void show(struct ether_arp *a);
- int main(int argc, char *argv[])
- {
- int i;
- char buffer[65535] = {0};
- unsigned char *head;
- struct ether_arp *a;
- ..........................................
- //截包分析包头...
- head=buffer+12;
- a=(struct ether_arp *)head;
- if((*head==0x0&&(*(head+1)==0x06)) //判断协议,显示包数据
- show(a);
- }//endmain
- void show(struct ether_arp *a)
- {
- printf("header:%d\n",a->eahdr);
- printf("dest ip = %d",a->tpa);
- printf("source ip =%d",a->spa);
- printf("dest mac =%d",a->tha);
- printf("source ip =%d",a->sha);
- return;
- }
复制代码
这么多人说了这么多答案,其实就只有这一个是正确的。
原因就是buffer是main函数中的栈空间,不能在show()函数里得到,而作者的代码的show()函数是没有参数的,因此buffer中的内容在调用show()函数的时候并没有传给show()函数,也就是说
在show()函数中,printf("header:%d\n",a->eahdr); 这样的代码,其中的a指向的是未知的区域,a的类型也未知,因此出现了LZ的错误.
刚才对icestare 的答案做了实际测试,证明只有他的回答是正确的。
这确实是一个非常隐蔽的错误,一般人真很难察觉到.
在类似:
main()
{
...
char buffer[SIZE];
function();
...
}
void function (void)
{
printf("%s" ,buffer)
}
这样的代码中,主函数中的缓冲区buffer是传不到fucntion里面的。 希望大家再对icestare的答案做一下测试也实验,看看到底对不对,我刚才在FreeBSD5.4自带的gcc中写了一个和LZ类似的代码测试了一下,结果证明icestare的回答是正确的。
改成以下代码后就可以:
main()
{
...
char buffer[SIZE];
function(buffer);
...
}
void function (char *buffer)
{
printf("%s" ,buffer)
} |
|