如何在C中的另一个函数中使用一个函数中的一个变量

时间:2019-02-26 09:31:09

标签: c file-handling uefi

头文件

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]);
            ....
    }
}
  • function1和function2在某个目录的一个文件中,function3在我正在写的另一个文件中。
  • 我在function3中调用了函数2。
  • 我想在function3中使用来自function2的“文件名”。注意:我无法更改function2'

2 个答案:

答案 0 :(得分:2)

您不能。

FILE句柄fread_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()。