我正在尝试在C中使用malloc启动静态变量(在函数内),但我得到的是“初始化程序不是常量错误”。我知道我不能用C中的非常量启动静态,但是有人能想到一个解决方案吗?我需要代码具有与此相同的效果:
static int *p = (int *)malloc(sizeof(int));
有诀窍/解决方法吗?
编辑:我有一个函数,每次标志变高时调用。在这个函数中,我正在创建并启动一个新线程。我声明了一个指向结构的指针,并使用malloc分配内存,然后将此指针传递给线程。然后该函数返回控制。当我重新进入该函数时,我最初打开的线程仍将运行,我希望能够访问我最初传递给线程的内存区域。这就是为什么我需要一个静态,以便我可以在第一次调用时使用malloc,然后在后续调用中使用相同的地址。这样我就可以从线程中获取信息。这一切都是为了避免使用全局变量。
答案 0 :(得分:16)
static int *p = NULL;
if(!p) p = (int *)malloc(sizeof(int));
答案 1 :(得分:8)
假设您需要函数静态变量:
int foo(void) {
static int b=1;
static int *p;
if (b) {
p = malloc(sizeof(int));
b = 0;
}
...
}
您可以将p值的NULL值用作检查,只要您知道,在第一次调用后它就永远不会是NULL
。
请记住检查malloc中的错误;它是运行时分配,并且在不再需要它时也应该被释放。
答案 2 :(得分:4)
malloc()
仅用于在运行时分配内存。静态变量在sompile时初始化。你想要:
static int p[1];
答案 3 :(得分: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()
的返回值,那么它可能有意义有类似的东西。
答案 4 :(得分:-1)
C不能那样做。 C ++可以使用静态构造函数。
你可以在main()或者在你需要指针之前调用的任何其他函数中做第一件事。
虽然不可移植,但一些可执行格式(如Classic Mac OS的代码片段管理器)支持初始化/终止入口点。 CFM初始化用于C ++静态构造。如果平台上的可执行格式支持初始化入口点,则可以使用该格式。