【问题标题】:How to make use of one variable in a function in another function in C [closed]如何在C中的另一个函数中使用一个函数中的一个变量[关闭]
【发布时间】:2019-02-26 09:31:09
【问题描述】:

头文件

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 在我正在编写的另一个文件中。
  • 我在函数 3 中调用了函数 2。
  • 我想在函数 3 中使用函数 2 中的“文件名”。注意:我无法更改 function2'

【问题讨论】:

    标签: c file-handling uefi


    【解决方案1】:

    你不能。

    FILE 句柄fread_variable 的局部变量。因此,read_variable 之外的任何东西都完全无法访问它。

    您没有向read_variable 显示完整代码,但鉴于它将文件句柄打开到局部变量中,我希望它在返回之前也会调用fclose

    如果不允许您修改read_variable,您是否考虑过将read_variable 的整个代码复制到您的own_function 调用中并对其进行修改以满足您的需求?

    【讨论】:

    • 感谢您的回复!在function2中,在fopen之后它读取(fread)变量然后只是做fclose(f)我试图在function3中复制function2并且一切正常。但是我不能复制现有的函数,而不能仅仅使用它来获取输出如何才能从函数 3 中的函数 2 获取“文件名”?
    • 你真正想做什么?
    • 将整个代码发布到read_variable。我怀疑您只需要正确初始化您的 var 结构,然后在通过一次调用 read_variable 读取它后解析整个文件。
    • 我不允许修改 read_variable 如何在 function3 中从 function2 获取“文件名”?
    【解决方案2】:

    你不能。至少不是以便携和符合标准的方式。当 read_variable() 返回时,f 已经超出范围,因此不再保证存在。如果您熟悉目标架构的调用堆栈约定,您可能能够通过使用指针算术进行越界访问来访问现在已取消初始化的内存,并祈祷任何有用的东西仍然存在,但您真的不应该做这个。您可以做但实际上不应该做的另一件顽皮的事情是,如果 read_variable() 没有关闭文件并因此存在文件句柄泄漏,则可能可以访问同一文件的另一个文件指针以找出文件号并使用特定于操作系统的 API 来访问该文件。这两个都在做不安全的访问,并调用未定义的行为,所以你真的不应该做任何一个。

    您可以做的是打开一个具有相同文件名的新文件,因为在调用 read_variable() 后文件名在 var.variable 中返回。要么,要么您必须修改 read_variable() 或在您可以修改的文件中重新实现 read_variable()。

    【讨论】:

    • 感谢您的回复!我可以从function3中的function2获取“文件名”吗?
    猜你喜欢
    • 2012-09-28
    • 1970-01-01
    • 2013-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-03
    • 1970-01-01
    相关资源
    最近更新 更多