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

时间:2013-05-23 22:17:54

标签: c static malloc constants initializer

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

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

有诀窍/解决方法吗?

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

5 个答案:

答案 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 ++静态构造。如果平台上的可执行格式支持初始化入口点,则可以使用该格式。