【问题标题】:What is wrong with my program in C?我的 C 程序有什么问题?
【发布时间】:2017-11-05 09:59:41
【问题描述】:

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;
}

哪里出错了? 为什么结果r一样?

如果在whilewhile 之外添加fflush,结果也相同。

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

【问题讨论】:

  • 请发布您的代码;不是它的链接。 :)
  • 把它分成两个fprintfs。
  • while (fgets(value, V_BUFF, fd) == NULL) 看起来很可疑
  • @BLUEPIXY 出于某种原因,我需要这个。
  • @GOLDEN_gun 不能同时为不同的目的使用相同的内存。

标签: c linux file


【解决方案1】:

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

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

快速修复:正如 BLUEPIXY 建议的那样,您可以拨打 fprintf 两次:

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

要正确解决这个问题,您必须使用 malloc (char *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));

【讨论】:

猜你喜欢
  • 2017-11-27
  • 2012-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多