繁体   English   中英

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

[英]How to initialize static pointer with malloc in C?

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

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

有技巧/解决方法吗?

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

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

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

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

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

记住要检查malloc中的错误。 它是运行时分配,并且在不再需要时也应将其释放。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM