C返回字符串不正确

时间:2014-02-12 22:50:09

标签: c string char return

我有一个简单的函数来获取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;
}

感谢您的回答!!此外,稍后免费。

3 个答案:

答案 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);