#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;
}
哪里错了? 为什么结果一样?
如果在while
内或while
外添加fflush
,结果也是一样的。
请帮帮我,告诉我是什么原因。 谢谢!
最佳答案
对参数进行求值,然后将其传递给 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));
关于c - 我的 C 程序有什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47120259/