如何在C中用malloc初始化静态指针?

Ara*_*uhi 8 c malloc static constants initializer

我正在尝试在C中使用malloc启动静态变量(在函数内),但我得到的是"初始化程序不是常量错误".我知道我不能在C中用非常量启动静态,但是有人能想到一个解决方案吗?我需要代码具有与此相同的效果:

static int *p = (int *)malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud)

有诀窍/解决方法吗?

编辑:我有一个函数,每次标志变高时调用.在这个函数中,我正在创建并启动一个新线程.我声明了一个指向结构的指针,并使用malloc分配内存,然后将此指针传递给线程.然后该函数返回控制.当我重新进入该函数时,我最初打开的线程仍将运行,我希望能够访问我最初传递给线程的内存区域.这就是为什么我需要一个静态,以便我可以在第一次调用时使用malloc,然后在后续调用中使用相同的地址.这样我就可以从线程中获取信息.这一切都是为了避免使用全局变量.

BLU*_*IXY 17

static int *p = NULL;
if(!p) p = (int *)malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud)

  • 这不需要两个变量,因此比接受的答案要好. (3认同)

Ela*_*zar 8

假设您需要函数静态变量:

int foo(void) {
    static int b=1;
    static int *p;
    if (b) {
        p =  malloc(sizeof(int));
        b = 0;
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

您可以将p值的NULL值用作检查,只要您知道它将永远不会NULL在第一次调用之后.

记得检查malloc中的错误; 它是一个运行时分配,并且在不再需要它时也应该被释放.


Lee*_*ker 5

malloc()仅用于在运行时分配内存。静态变量在编译时初始化。你要:

static int p[1];
Run Code Online (Sandbox Code Playgroud)