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

问题描述 投票:0回答:6

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

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

有什么技巧/解决方法吗?

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

c static malloc constants initializer
6个回答
22
投票
static int *p = NULL;
if(!p) p = (int *)malloc(sizeof(int));

9
投票

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

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

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

NULL

记得检查malloc是否有错误;它是一个运行时分配,当不再需要它时也应该被释放。


5
投票

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

static int p[1];

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()
的返回值,那么拥有这样的东西可能是有意义的。


0
投票

malloc()将在内部调用系统调用(在unix中是sbrk())来获取大小大于请求的内存块。稍后,如果用户需要更多内存,那么 malloc() 将从它获得的额外块中提供。


-2
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.