Как уже отмечали другие, вы не можете вернуть указатель на объект с автоматической продолжительностью хранения - когда eout
выходит из области видимости, он больше не существует. GCC фактически предупреждает вас об этом:
ether_ntoa.c: In function ‘ether_ntoa’:
ether_ntoa.c:26: warning: function returns address of local variable
Обычный способ достичь желаемого результата - назначить вызывающего абонента , ответственного за распределение адресата. Например:
int ether_ntoa(unsigned char etheraddr[ETHER_ADDR_LEN], char *dest, size_t len)
{
return snprintf(dest, len, "%02x:%02x:%02x:%02x:%02x:%02x",
(unsigned)etheraddr[0],
(unsigned)etheraddr[1],
(unsigned)etheraddr[2],
(unsigned)etheraddr[3],
(unsigned)etheraddr[4],
(unsigned)etheraddr[5]);
}
(обратите внимание также, что ваша процедура преобразования с кодированием вручную может быть заменена простым вызовом snprintf()
). Вы бы назвали это так:
char eout[32];
ether_ntoa(etheraddr, eout, sizeof eout);
/* Converted address is now in eout */
Функция ether_ntoa()
в Linux использует другой подход - она объявляет буфер в функции как static
. Если вы это сделаете, то ваш eout
будет жить всю жизнь программы, поэтому вы можете вернуть указатель на него. Недостатком является то, что есть только один eout
- каждый раз, когда вы звоните ether_ntoa
, он будет перезаписывать предыдущий.