Я пытаюсь получить Mac адрес этого кода:Pass указатель голец функционировать в C
void getMacAdress(unsigned char **address)
{
int s;
struct ifreq buffer;
s = socket(PF_INET, SOCK_DGRAM, 0);
memset(&buffer, 0x00, sizeof(buffer));
strcpy(buffer.ifr_name, "eth0");
ioctl(s, SIOCGIFHWADDR, &buffer);
close(s);
*address = (unsigned char *)buffer.ifr_hwaddr.sa_data;
for (s = 0; s < 6; s++)
{
printf("%.2X ", *(*address + s));
}
printf("\n");
}
int main(int argc, char *argv[])
{
unsigned char *address;
getMacAdress(&address);
int i;
for (i = 0; i < 6; i++)
{
printf("%.2X ", *(address + i));
}
printf("\n");
return 0;
}
я получил правильный результат, как
08 00 27 0A 4E 98
08 00 27 0A 4E 98
, но при удалении printf
сниппета кода в getMacAddress()
функцию он становится:
void getMacAdress(unsigned char **address)
{
int s;
struct ifreq buffer;
s = socket(PF_INET, SOCK_DGRAM, 0);
memset(&buffer, 0x00, sizeof(buffer));
strcpy(buffer.ifr_name, "eth0");
ioctl(s, SIOCGIFHWADDR, &buffer);
close(s);
*address = (unsigned char *)buffer.ifr_hwaddr.sa_data;
printf("\n");
}
Я получил неправильный результат
08 00 00 00 00 00
Можете ли вы объяснить мне, почему это так и как я могу решить эту проблему?
Почему вы передаете «указатель на указатель на символ»? – Olaf
Я думаю, что указатель, который вы пишете в свой var, становится недействительным, как только вы выходите из функции, так как ваш буфер находится в стеке. –
Вы копируете указатель на локальную переменную в 'getMacAdress()' в 'адрес', переданный в нее из' main() ', и это приводит к неопределенному поведению. Пространство повторно используется, и вы получаете то, что получаете (и вам повезло, что вы не потерпели крах). –