我的C程序出了什么问题?

时间:2017-11-05 09:59:41

标签: c linux file

Code link

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define OS_TYPE    "/proc/sys/kernel/ostype"
#define OS_RELEASE "/proc/sys/kernel/osrelease"
#define V_BUFF     30

static const char * get_value(const char * file_path)
{
        static char value[V_BUFF];
        FILE *fd;

        memset(value, 0, sizeof(value));

        if ((fd = fopen(file_path, "r")) == NULL) {
                fputs("Fopen function error.\n", stderr);
                exit(EXIT_FAILURE);
        }

        while (fgets(value, V_BUFF, fd) == NULL) {
                fputs( "Fscanf function error.\n", stderr);
                exit(EXIT_FAILURE);
        }

        fclose(fd);

        return value;
}

int main(void) {
        fprintf(stdout, "%s%s", get_value(OS_TYPE), get_value(OS_RELEASE));

        return EXIT_SUCCESS;
}

哪里错了? 为什么结果相同?

如果在fflushwhile中添加while,则结果也相同。

Plz帮助我,告诉我什么原因。 谢谢!

1 个答案:

答案 0 :(得分:2)

参数被评估然后传递给fprintf以格式化它们。

由于两个结果只有一个内存区域(static),最后一个函数调用“获胜”并且您获得两倍相同的结果(请注意,评估顺序是实现定义的,因此您可以获得两倍的结果第一个结果,或第二个结果的两倍)

Quickfix:正如BLUEPIXY建议的那样,您可以拨打fprintf两次:

    fprintf(stdout, "%s", get_value(OS_TYPE));
    fprintf(stdout, "%s", get_value(OS_RELEASE));

要正确修复,你必须使用mallocchar *value = malloc(V_BUFF);)分配内存,但在这种情况下你必须存储指针才能释放它,或者通过函数的额外参数,作为内部使用的缓冲区,就像一些标准函数那样。

const char * get_value(const char * file_path, char *value)
{
    ...
    return value;
}

现在你可以在一行中使用单独的缓冲区进行调用,并且没有内存泄漏:

char vbuf[V_BUFF],obuf[V_BUFF];
fprintf(stdout, "%s%s", get_value(OS_TYPE,vbuf), get_value(OS_RELEASE,obuf));