有个指针做函数参数的问题

dongsweet 2009-06-19 01:28:33
问题如下:
这样调用并不能使d作为一个指针在Main函数中用(即调用后d没东西),我有点搞不清楚该怎么写,才让d在main中调用select_device函数后,d中保留在函数中使用的地址,即pcap_if_t * d;保持不动,不改,就改改形参的使用和调用的方法。大家帮帮我吧!

#include "stdafx.h"
#include "pcap.h"

int select_device(pcap_if_t *d);
int open_device(pcap_t *device,pcap_if_t *d);
char errbuf[PCAP_ERRBUF_SIZE];

int _tmain()//int argc, _TCHAR* argv[])
{
pcap_if_t * d; //打开适配器时使用
pcap_t * recv; //接收时使用
pcap_t * send1 ,* send2; //发送时使用,设置两个发送网卡

int i;
//char errbuf[PCAP_ERRBUF_SIZE];

printf("\nOPEN DEVICE FOR CAPTURING.");
if(select_device(d)!=0) //这样调用会提示d未被初始化。
return -1;
。。。
return 0;
}

int select_device(pcap_if_t *d)
{
pcap_if_t *alldevs;
char errbuf[PCAP_ERRBUF_SIZE];
int i=0,inum=0;

/* 获取本机设备列表 */
if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,&alldevs,errbuf)==-1)
{
fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
exit(1);
}

/* 显示本机设备 */
for(d=alldevs;d!=NULL;d=d->next)
printf("%d. %s, %s\n",++i,d->name,d->description?d->description:"(No Description Available.)");

if(i==0)
{
printf("No Interface found! Please Check your installation!\n");
return -1;
}

/* 设备选择 */
printf("Please select the adapter you want to use (1-%d):",i);
scanf_s("%d%*c",&inum);
if(inum<1 || inum>i)
{
printf("\nWrong selection! Please check your Selection!");
return -1;
}
else
{
/* 跳至选择的适配器 */
for(d=alldevs,i=1;i<inum;d=d->next,i++);
}
return 0;
}
...全文
104 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
dongsweet 2009-06-19
  • 打赏
  • 举报
回复
搞定了!
这样调用的if(show_device(&alldevs)!=0)
return -1;
else
{
if(open_device(alldevs,&recv)!=0)
return -1;
}
int show_device(pcap_if_t **alldevs)
{
pcap_if_t *d;
char errbuf[PCAP_ERRBUF_SIZE];
alldevs_no=0;

/* 获取本机设备列表 */
if(pcap_findalldevs_ex(PCAP_SRC_IF_STRING,NULL,alldevs,errbuf)==-1)
{
fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
exit(1);
}

/* 显示本机设备 */
for(d=(*alldevs);d!=NULL;d=d->next)
printf("%d. %s, %s\n",++alldevs_no,d->name,d->description?d->description:"(No Description Available.)");

if(alldevs_no==0)
{
printf("No Interface found! Please Check your installation!\n");
return -1;
}
return 0;
}
dongsweet 2009-06-19
  • 打赏
  • 举报
回复
WinPcap的说明里这样说的:
alldevs,: a 'struct pcap_if_t' pointer, which will be properly allocated inside this function. When the function returns, it is set to point to the first element of the interface list; each element of the list is of type 'struct pcap_if_t'.

就是不知道怎么回事我写的函数select_device返回的时候d就变回0了
pengzhixi 2009-06-19
  • 打赏
  • 举报
回复
alldevs 不是动态分配内存的吧.如果不是那么出了这个函数alldevs里面的地址是否还有效值得怀疑.建议你打印一下alldevs 里面包含的地址.
dongsweet 2009-06-19
  • 打赏
  • 举报
回复
我看了调试,在select_device中,d确实被正常赋值了,但是当执行完select_device回到main后,d就又变回了0。这个应该怎么解决呢?谢谢了。
dongsweet 2009-06-19
  • 打赏
  • 举报
回复
pcap_findalldevs_ex这个函数中应该是对alldevs

然后我的目的不是要给d分配空间,而是让d指向alldevs所指向的空间

谢谢你哦!
pengzhixi 2009-06-19
  • 打赏
  • 举报
回复
你先确认int select_device(pcap_if_t *&d)
到底有没有给d分配空间.是哪一句表明给d 分配了空间
dongsweet 2009-06-19
  • 打赏
  • 举报
回复
这样的话编译没有问题,但是d在调用函数之后也还一直是0啊。
pengzhixi 2009-06-19
  • 打赏
  • 举报
回复
pcap_if_t * d=0;
int select_device(pcap_if_t *&d)

先调用这个函数,在调用这个函数之前绝对不要使用d
dongsweet 2009-06-19
  • 打赏
  • 举报
回复
顺便说一下pcap_findalldevs_ex这个函数中应该是对alldevs分配了空间的吧?然后我只是想让d指向它。
pengzhixi 2009-06-19
  • 打赏
  • 举报
回复
pcap_if_t * d; //打开适配器时使用
你这里要为d分配空间啊.
int select_device(pcap_if_t *&d);这样就OK了
当然其他函数也要用指针的引用

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧