在C语言中传递静态全局变量指针

6

将指向静态结构体的指针传递给函数安全吗?

我有以下代码:

mymodule.c:

static MYEVENT_STRUC_T event;
uint_32 _myRtos_set_event(MYEVENT_STRUCT_T* event_ptr, uint_32 mask);

uint_32 mymodule_set_event(uint_32 event_mask){   

    /* Kernel function */
    /* Defined outside mymodule.c,*/
    /* Is it safe to call it with &event?  */
    return _myRtos_set_event(&event, event_mask);

}

事先看起来是安全的。注意:您在定义中忘记了输入参数MYEVENT_STRUCT_T* event_ptr,因此_myRtos_set_event(event, event_mask);会出现错误。 - n0p
绝大部分不涉及内存分配的函数都可以使用静态变量的地址,来进行操作。例如,你不能调用 realloc 或者 free 并且将一个静态变量的指针传递给它,但是大多数函数是安全的。 - n. m.
1个回答

16

它是安全的。static并不意味着“不能在模块之外使用”,而是“不能在模块之外引用”,即该符号本身不会被导出,但变量仍然存在于进程的某个内存中,并且可以在模块之间使用。

我唯一不确定的是,如果您正在使用指针从用户模式传递数据到内核模式,我不确定这样做是否安全。如果我记得正确,有一些函数应该调用以将内存从用户空间复制到内核空间。但不完全确定。


有一些函数你应该调用,它会将内存从用户空间复制到内核空间。内核会处理这个过程;除非你正在编写内核,否则你甚至不应该知道这样的函数存在。 - n. m.
如果这是Windows,我相信内核模式代码可以访问用户模式内存,只要你的内核模式代码在用户进程的上下文中执行。也就是说,用户模式代码调用内核模式代码,而该内核模式代码在用户的上下文中执行,并且因此可以访问用户模式内存,直到内核模式代码执行完成并从用户的调用返回为止。对于Linux,我不太确定它是如何工作的。我的信息是来自NT系统。 - octopusgrabbus

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接