[英]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.