Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在C中向静态全局变量传递指针_C_Static Variables - Fatal编程技术网

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

在C中向静态全局变量传递指针,c,static-variables,C,Static Variables,将指向静态结构的指针传递给函数是否安全 我有这样的想法: 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 mymodu

将指向静态结构的指针传递给函数是否安全

我有这样的想法:

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\u STRUCT*event\u ptr
,因此
\u myRtos\u set\u event(event,event\u mask)绝大多数不处理内存分配的函数都喜欢使用静态变量的地址。例如,您不能调用
realloc
free
并向其传递指向静态变量的指针,但大多数函数都是安全的。“您应该调用某个函数,将内存从用户空间复制到内核空间”——内核负责这一点;除非您正在编写内核,否则您甚至不应该知道这样的函数存在。如果这是Windows,我相信如果您的内核模式代码是在用户进程的上下文中执行的,那么内核模式代码可以触及用户模式内存。即用户模式代码调用内核模式代码,内核模式代码在用户上下文中执行,因此可以访问用户模式内存,直到内核模式代码完成执行并从用户调用返回。我不太确定它在Linux上是如何工作的。我的信息是从新界回来的。