我有一个简单的函数来获取linux机器上的MAC地址(假设eth0存在。我稍后会写更多)。
方面问题:所有Linux发行版都有通用接口吗?除了lo?
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;
}
感谢您的回答!!此外,稍后免费。
答案 0 :(得分:2)
char *mac;
fgets(mac, 18, mf);
您需要首先将内存分配给mac
,可能使用malloc
。
正如jia103在评论中指出的那样,构建代码的一种方法可能是:
char* getmac(char *buf, size_t size);
然后调用者可以更自由地决定内容的存储方式(可能客户端对malloc
并不感兴趣,而且更喜欢堆栈中的数组)。
答案 1 :(得分:1)
您从未为mac
分配内存。 Malloc it:
char * mac = malloc(18);
(char mac[18]
不起作用,因为你想从函数中返回字符串,所以它需要超出getmac
的范围
不要忘记free
它!
或者,让呼叫者负责:
void getmac(char mac[18]){
请注意,这需要您传递一个恰好为18 char
s的数组,即不是malloc
或不是18个元素的数组。所以,用它来称呼它:
char mac[18];
getmac(mac);
为了允许更多的自由声明它:
void getmac(char * mac)
确保调用者始终分配足够的内存。
正如其他答案所指出的那样,您也可以传递一个size
参数,但由于您知道需要一个正好为18个字符的缓冲区,这对我来说似乎有点多余。使用可变长度的字符串时,size
参数确实很重要。
答案 2 :(得分:0)
你写的是你不应该的记忆。您从未将mac
初始化为任何可用内存,因此它会写入最初的内存位置。如果你有一个初始化变量的习惯,你会立即发现这一点,但我不记得C是否允许这样做:
FILE* mf = NULL;
char* mac = NULL;
这应该被捕获的原因是因为当你尝试调用fgets()并将它传递给mac时,你的程序会失败。
你应该做的是提供一个存储区域来写入数据,以便在它恢复时可以获得它。
void getmac(char* buffer,
int bufsize)
{
...
}
然后,您可以按如下方式调用它:
const int BUFSIZE = 1024;
char m[BUFSIZE] = {0};
getmac(m, BUFSIZE);
printf("%s\n", m);