Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在C中用malloc初始化静态指针?_C_Static_Malloc_Constants_Initializer - Fatal编程技术网

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

如何在C中用malloc初始化静态指针?,c,static,malloc,constants,initializer,C,Static,Malloc,Constants,Initializer,我试图用C中的malloc启动一个静态变量(在函数内部),但是我得到了“initializer not constant error”。我知道我不能用C中的非常量启动静态,但是有人能想出一个解决方案吗?我需要代码具有与此相同的效果: static int *p = (int *)malloc(sizeof(int)); 有什么诀窍/解决方法吗 编辑:我有一个函数,每当一个标志变高时就会调用它。在这个函数中,我创建并启动一个新线程。我声明一个指向结构的指针,并使用malloc分配内存,然后将该指

我试图用C中的malloc启动一个静态变量(在函数内部),但是我得到了“initializer not constant error”。我知道我不能用C中的非常量启动静态,但是有人能想出一个解决方案吗?我需要代码具有与此相同的效果:

static int *p = (int *)malloc(sizeof(int));
有什么诀窍/解决方法吗


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

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

int foo(void) {
    static int b=1;
    static int *p;
    if (b) {
        p =  malloc(sizeof(int));
        b = 0;
    }
    ...
}
您可以使用p的NULL值作为检查,只要您知道在第一次调用后p永远不会为
NULL

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

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

static int p[1];

C不能那样做。C++可以使用静态构造函数。 可以在main()中或在需要指针之前调用的任何其他函数中首先进行分配


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

如果是静态文件,则应在该文件中提供一个公共函数来初始化该静态文件

void initialize () {
    if (p == 0) p = malloc(sizeof(*p));
}
或者,可以使用静态函数代替静态变量。但是,每次访问都要花费您一张支票:

static int * p () {
    static int * p_;
    return p_ ? p_ : (p_ = malloc(sizeof(*p_)));
}

对于整数类型,这似乎有点傻,但是如果
p
是更复杂的类型,需要的初始化序列比
malloc()
的返回值更复杂,如果您希望分配取决于第一次调用的参数,那么这样做可能是有意义的。

这将无助于您。虽然VLA可能会有所帮助,但我不知道具体如何。那么您实际上是在运行时进行分配,您需要的是
malloc()
,而不是初始值设定项。这是两件不同的事情。是的,但这是OP所要求的:在运行时为静态变量分配一次。谢谢你的解决方案!基本上,我试图做的是让malloc分配一次,并为后续调用保留相同的地址。这正是它要做的。它将如何编译?“如果…”必须放在main()这样的函数中,在这种情况下,您有普通的运行时分配。@LeeDanielCrocker-我简单地假设它在函数中。是的,这当然是一个普通的运行时分配——这是OP所要求的。听起来像是在谈论函数中的静态声明。你最初的问题没有这么说;您询问了有关文件级静态文件的问题。是的,这个答案适用于函数中声明的静态。是的,你恰好假设了OP没有说的,所以你说对了。愚蠢的我,回答实际提出的问题。:-)这不需要两个变量,因此比公认的答案要好。@JonathanLeffler我同意,尽管我的答案仍然很有价值,因为它更一般-适用于没有指定空值的情况。
static int *p = NULL;
if(!p) p = (int *)malloc(sizeof(int));