头文件
struct some_variable {
char *variable;
uint32_t infoe;
uint8_t *info0;
};
1.c在某些目录中
function1:
----------
static void filename(const char *variable,
function2:
----------
int read_variable(some_variable *var)
FILE *f = NULL;
f = fopen(filename, "rb");
.
.
.
.
}
其他目录中的2.c
function3:
----------
int own_function()
{
char buf[256];
uint8_t cam[3];
struct some_variable var;
var.variable = "iop";
if (strncmp(var.variable, "iop", 3) == 0) {
read_variable(&var);
f = fopen(filename,"r");
while (fgets(buf, sizeof buf, f)) {
sscanf(b, "%hhX:%hhX:%hhX:"
&cam[0], &cam[1], &cam[2]);
....
}
}
答案 0 :(得分:2)
您不能。
FILE
句柄f
是read_variable
的局部变量。因此,read_variable
之外的任何东西都无法访问。
您没有向read_variable
显示完整的代码,但是考虑到它会将文件句柄打开到局部变量中,我希望它在返回之前也要调用fclose
。
如果不允许您修改read_variable
,您是否考虑过将read_variable
的整个代码复制到您的own_function
调用中并进行修改以满足您的需求?
答案 1 :(得分:0)
不能。至少不是以可移植且符合标准的方式。到read_variable()返回时,f
已经超出范围,因此不再保证它存在。如果您熟悉目标体系结构的调用堆栈约定,则可以通过使用指针算术进行越界访问来访问现在已初始化的内存,并祈祷仍然有用的东西在那里,但是您实际上不应该这样做做这个。您可以做的另一件事是调皮的,但实际上不应该这样做:如果read_variable()没有关闭文件并因此导致文件句柄泄漏,则有可能可以访问同一文件的另一个文件指针,从而找出文件编号并使用特定于操作系统的API来访问文件。这两种方法都在进行不安全的访问,并且会调用未定义的行为,因此您实际上不应执行任何一种操作。
相反,您可以做的是打开一个具有相同文件名的新文件,因为在调用read_variable()之后,文件名在var.variable
中返回。要么,要么必须修改read_variable()或在可以修改的文件中重新实现read_variable()。