2014-02-12 4 views
0

У меня есть простая функция для получения MAC-адреса на машине linux (при условии, что eth0 существует. Я напишу позже).C Возвращаемая строка Неправильная

Вопрос: Есть ли универсальный интерфейс во всех дистрибутивах Linux? Кроме того?

C Функция:

char* getmac(){ 
     FILE *mf; 
     mf = fopen("/sys/class/net/eth0/address", "r"); 
     if(!mf) exit(-1); 
     char *mac; 
     fgets(mac, 18, mf); 
     printf("%2\n", mac); 
     return mac; 
} 

Теперь это печатает MAC отлично. Однако, когда я возвращаю его, я получаю совершенно другое значение.

char *m; 
m = getmac(); 
printf("%s\n", m); 

дает совершенно другую, в основном нечитаемую строку. Первые 2 символа ВСЕГДА верно, то после этого, это нечитаемым ...


Это работает как шарм:

char* getmac(){ 
     FILE *mf; 
     mf = fopen("/sys/class/net/eth0/address", "r"); 
     if(!mf) exit(-1); 
     char *mac; 
     mac = calloc(18, sizeof(char)); 
     if(!mac) exit(-1); 
     fgets(mac, 18, mf); 
     printf("%s\n", mac); 
     return mac; 
} 

Спасибо за ответы !! Кроме того, бесплатно.

+1

'символ * макинтош;' является неиницализированным. Это ничего не говорит. – wildplasser

+0

Не записывайте «ответ» в заголовок, принимайте соответствующий ответ, и вопрос получает помеченный как ответ, ответчик получает дополнительную информацию, и вопрос исчезает из раздела вопросов без ответа. – datenwolf

+0

Приношу свои извинения. В то время временный порог принятия ответа еще не прошел. Спасибо за совет! – Goodies

ответ

1

Вы никогда не выделили память для mac. ТаНос его:

char * mac = malloc(18); 

(char mac[18] не будет работать, так как вы хотите, чтобы вернуть строку из функции, поэтому она должна жить за рамки getmac)

Не забудьте free его!

С другой стороны, сделать его ответственность звонившего:

void getmac(char mac[18]){ 

Заметьте, что для этого требуется, чтобы передать массив из 18 char с, то есть не тот, который был malloc ред или не совсем 18 элементов. Так, назову его с этим:

char mac[18]; 
getmac(mac); 

Чтобы немного больше свободы объявит его с этим:

void getmac(char * mac) 

И убедитесь, что абонент всегда выделяет достаточно памяти.

В качестве ответа на другие вопросы вы также можете передать параметр size, но поскольку вы знаете, что вам нужен буфер ровно 18 символов, это кажется немного лишним для меня.Параметр A size становится важным, когда вы работаете со строками переменной длины.

+0

Будет обновляться :) Работал как шарм с calloc (строка заканчивается на \ x00, которая инициализируется calloc). – Goodies

+0

'malloc' /' calloc' и 'free' великолепны, но если у вас есть контроль над этим методом, подумайте о том, чтобы взять буфер, предоставленный клиентом. Затем клиент отвечает как за распределение **, так и за освобождение, и с меньшей вероятностью забывает «освободить». – jia103

+0

@ jia103 Добавлены альтернативы 'malloc'-less – Kninnug

2
char *mac; 
    fgets(mac, 18, mf); 

Вам нужно назначить память mac первым, возможно, с malloc.


Как jia103 указывает в комментариях, один способ структурирования кода может быть:

char* getmac(char *buf, size_t size); 

Затем абонент может более свободно решать, каким образом содержимое сохраняется (возможно, клиент не является все, что интересует malloc, и предпочли бы массив в стеке).

+1

'malloc' и' free' отлично, но если у вас есть контроль над этим методом, подумайте о том, чтобы взять буфер, предоставленный клиентом. Затем клиент отвечает как за распределение **, так и за освобождение, и с меньшей вероятностью забывает «освободить». – jia103

+0

@ jia103 Хороший звонок, спасибо:) – cnicutar

0

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

FILE* mf = NULL; 
char* mac = NULL; 

Причина этого следует увязнуть в том, что ваша программа потерпит неудачу при попытке вызовите fgets() и передайте ему NULL для mac.

Что нужно сделать, это предоставить область хранения, в которой можно записать данные, чтобы вы могли получить ее, когда она вернется.

void getmac(char* buffer, 
      int bufsize) 
{ 
    ... 
} 

Затем, вы можете назвать это следующим образом:

const int BUFSIZE = 1024; 
char m[BUFSIZE] = {0}; 
getmac(m, BUFSIZE); 
printf("%s\n", m); 
Смежные вопросы