我正在尝试使用 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()
的返回值,那么拥有这样的东西可能是有意义的。
malloc()将在内部调用系统调用(在unix中是sbrk())来获取大小大于请求的内存块。稍后,如果用户需要更多内存,那么 malloc() 将从它获得的额外块中提供。
C 不能这么做。 C++ 可以使用静态构造函数。
您可以在 main() 中或在需要指针之前调用的任何其他函数中首先进行分配。
虽然不可移植,但某些可执行格式(例如经典 Mac OS 的代码片段管理器)支持初始化/终止入口点。 CFM 初始化用于 C++ 静态构造。 如果您平台上的可执行格式支持初始化入口点,您可以使用它。