如何在c中动态分配静态存储?

时间:2015-03-01 17:31:40

标签: c list memory-management dynamic static

在一个递归方法中对树的外部节点进行分组,我需要在该函数内动态分配内存。但是语句

static node* ext_node = malloc (sizeof(node)); 

无法正常工作,编译器会出错,即

  

初始化元素不是常量。

总之,我想问一下,当动态获取指针指向的内存时,如何在递归调用中使用static关键字和指针?

我需要这个,因为当需要在列表中添加更多元素时,方法insert_to_end (node*)将负责为新节点分配存储,因此我可以创建list任何长度,也是确切的内存要求。

但如何用c语言实现这一目标?

2 个答案:

答案 0 :(得分:5)

请注意,在递归函数中使用static一般是错误的(并且也是线程不安全的)。通过参数将所需数据传递到函数中几乎总是更好。

但是,如果你坚持,你可以这样做:

static node* ext_node;
if (ext_node == NULL) ext_node = malloc (sizeof(node)); 
  

该错误没有意义

C编译器将在编译时初始化静态变量 (在C ++中放宽了这个要求,原始代码将使用C ++编译器进行编译)。

你可以这样做:

static int foo;  // default initialized to 0
static int bar = 42;

但不是这样:

static int baz = some_func();  // Error: at compile time the value to put into baz is not known.

答案 1 :(得分:3)

如果你真的需要这样做,只需将它分成2个操作,如下所示:

static node *ext_node;

if (ext_node == NULL)
    ext_node = malloc(sizeof(node));

但对我来说它看起来有点瑕疵(通常在函数内使用static变量是一种不好的做法 - 使函数不是reentrable)。

为什么不将此ext_node作为参数传递给您的函数?为什么你需要首先做这个变量static