头文件
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]);
....
}
}
你不能。
FILE
手柄,f
是read_variable
的局部变量。因此,read_variable
以外的任何东西都完全无法进入。
你没有向read_variable
展示完整的代码,但鉴于它将文件句柄打开到局部变量,我希望它在返回之前也调用fclose
。
如果您不被允许修改read_variable
,您是否考虑过将read_variable
的整个代码复制到您的own_function
电话并修改它以满足您的需求?
你不能。至少不是以便携式和标准兼容的方式。当read_variable()返回时,f
已经超出范围,因此不再保证存在。如果你熟悉目标体系结构的调用堆栈约定,你可以通过使用指针算法进行越界访问来访问现在去初始化的内存,并祈祷任何有用的东西仍然存在,但你真的不应该做这个。另一个顽皮的事情,你可以做,但实际上不应该是如果read_variable()没有关闭文件,从而有一个文件句柄泄漏,有可能访问另一个文件指针为同一个文件找出文件号并使用特定于操作系统的API来访问该文件。这两个都在进行不安全的访问,并调用未定义的行为,所以你真的不应该做任何一个。
相反,你可以做的是打开一个具有相同文件名的新文件,因为在调用read_variable()之后在var.variable
中返回文件名。要么是这样,要么必须修改read_variable()或重新实现read_variable()在您可以修改的文件中。