2

我正在尝试使用 ether_ntoa 打印 MAC 地址。当我尝试做

printf("MAC (src): %s\n",ether_ntoa((struct ether_addr *)&eheader->ether_shost));

我遇到了分段错误,所以我想出了两种不同的方法:

这是片段代码 nº1:

struct ether_header *eheader;
char *p;
...
p = ether_ntoa(struct ether_addr *) &eheader->ether_shost);
printf("-MAC (src): %s\n",p);

我得到的警告是:

赋值使指针从 整数而不进行强制转换

所以我做演员,然后...

这是代码片段 nº2:

struct ether_header *eheader;
char *p;
...
p = (char *) ether_ntoa((struct ether_addr *) &eheader->ether_shost);
printf("-MAC (src): %s\n",p);

我得到的警告是:

从不同大小的整数转换为指针

如果你看一下手册页,ether_ntoa 是这样定义的,返回一个char *

extern char *ether_ntoa (__const struct ether_addr *__addr) __THROW;

所以我不知道我做错了什么。问题是“不是”警告,是当我尝试打印它时出现的分段错误。

我在 openSUSE 下遇到这个错误(在 ubuntu 中我不需要做这个 *p 技巧)所以如果这里有 openSUSE 专家,我会感谢她的帮助。

非常感谢!

4

3 回答 3

2

这个警告:

assignment makes pointer from integer without a cast

...不是添加演员表的邀请。它告诉你一个更严重的问题;在这种情况下,编译器认为ether_ntoa()返回一个int.

当您使用没有范围内声明的函数时会发生这种情况;对于这样的库函数,这意味着您没有包含正确的标题。对于ether_ntoa(),你需要#include <netinet/ether.h>

于 2010-06-04T04:17:43.073 回答
0

这听起来像是头文件/库和编译器之间的字长不匹配。您在那台 Suse 机器中有 64 位和 32 位环境的奇怪组合吗?

于 2010-06-04T02:56:30.003 回答
0

这是图书馆的问题。我不知道我是怎么不检查的(可能是因为它是老师提供的文件,其中包含所需的所有库 ¬¬)。执行包括:

#include <netinet/ether.h>

是解决方案,所以我认为问题已得到解答。

非常感谢你们俩。

于 2010-06-04T12:34:13.490 回答