10

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

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

有技巧/解决方法吗?

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

4

5 回答 5

21
static int *p = NULL;
if(!p) p = (int *)malloc(sizeof(int));
于 2013-05-23T22:40:18.870 回答
9

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

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

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

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

于 2013-05-23T22:24:31.157 回答
4

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

static int p[1];
于 2013-05-23T22:24:44.017 回答
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(),那么拥有这样的东西可能是有意义的。

于 2013-05-23T22:27:44.940 回答
-2

C 做不到。C++ 可以使用静态构造函数。

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

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

于 2013-05-23T22:26:41.617 回答