#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;
}
哪里错了? 为什么结果相同?
如果在fflush
或while
中添加while
,则结果也相同。
答案 0 :(得分:2)
参数被评估然后传递给fprintf
以格式化它们。
由于两个结果只有一个内存区域(static
),最后一个函数调用“获胜”并且您获得两倍相同的结果(请注意,评估顺序是实现定义的,因此您可以获得两倍的结果第一个结果,或第二个结果的两倍)
Quickfix:正如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));