проблема приведения указателей ether_ntoa - PullRequest
2 голосов
/ 04 июня 2010

Я пытаюсь распечатать MAC-адрес с помощью ether_ntoa. Когда я пытаюсь сделать

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

Я получил ошибку сегментации, поэтому я предложил два разных подхода:

Это код фрагмента № 1:

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

и предупреждение, которое я получаю:

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

так что я снимаюсь и ...

Это код фрагмента №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, я буду признателен за ее помощь.

Большое спасибо!

Ответы [ 3 ]

2 голосов
/ 04 июня 2010

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

assignment makes pointer from integer without a cast

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

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

0 голосов
/ 04 июня 2010

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

#include <netinet/ether.h>

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

Большое спасибо вам обоим.

0 голосов
/ 04 июня 2010

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

...