2010-06-04 5 views
2

Я пытаюсь распечатать MAC-адрес, используя ether_ntoa. Когда я пытаюсь сделатьпроблема с указателями ether_ntoa

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); 

и предупреждение I получить это:

назначение делает указатель из целого без броска

так, что я делаю бросок и ...

Это фрагмент кода 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 определяется таким образом, возвращая символ *:

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

, так что я не знаю, что я делаю неправильно. Проблема заключается не в предупреждении, это ошибка сегментации, когда она появляется, когда я пытаюсь ее распечатать.

Я получаю эту ошибку под openSUSE (в ubuntu мне не нужно это делать * p трюк), поэтому, если есть эксперт openSUSE, я буду благодарен ей за помощь.

спасибо!

ответ

0

Это наверняка звучит как несоответствие размера слова между заголовками/библиотекой и компилятором. У вас есть странное сочетание 64-битной и 32-битной среды в этой машине Suse?

2

Это предупреждение:

assignment makes pointer from integer without a cast 

... это не приглашение, чтобы добавить оттенок. Это говорит о более серьезной проблеме; в этом случае, что компилятор считает, что ether_ntoa() возвращает int.

Это происходит, когда вы используете функцию без объявления в области; для такой библиотечной функции это означает, что вы не включили правый заголовок. Для ether_ntoa() вам нужно #include <netinet/ether.h>.

+0

Если бы эта точная проблема была решена с этим. Я ожидал, что компилятор будет жаловаться на неявное объявление. – Aatch

0

Это была проблема с библиотекой. Я не знаю, как я не проверял это (возможно, потому, что это был файл, предоставленный преподавателем со всеми необходимыми библиотеками ¬¬). Ведение включаемые:

#include <netinet/ether.h> 

было решение, поэтому я считаю этот вопрос ответил.

Благодарим вас обоих.

Смежные вопросы