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

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

static int *p = (int *)malloc(sizeof(int)); 

有诀窍/解决方法吗?

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

假设你想要函数静态变量:

 int foo(void) { static int b=1; static int *p; if (b) { p = malloc(sizeof(int)); b = 0; } ... } 

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

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

 static int *p = NULL; if(!p) p = (int *)malloc(sizeof(int)); 

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

 static int p[1]; 

如果它是文件静态的,那么您应该在该文件中提供一个初始化该静态的公共函数。

 void initialize () { if (p == 0) p = malloc(sizeof(*p)); } 

或者,您可以使用静态函数而不是静态变量。 虽然每次访问都需要支付一次检查费用:

 static int * p () { static int * p_; return p_ ? p_ : (p_ = malloc(sizeof(*p_))); } 

对于整数类型,这似乎有点傻,但如果p是一些更复杂的类型,需要一个比malloc()的返回值更复杂的初始化序列,那么有这样的东西可能是有意义的。

C不能那样做。 C ++可以使用静态构造函数。

您可以在main()中执行首先分配,或者在需要指针之前调用的任何其他函数中进行分配。

虽然不可移植,但一些可执行格式(如Classic Mac OS的代码片段管理器)支持初始化/终止入口点。 CFM初始化用于C ++静态构造。 如果平台上的可执行格式支持初始化入口点,则可以使用该格式。