需要动态分配(初始化)静态变量

问题描述:

我需要在C静态字符串(当量)可变的,我有麻烦实施类似的东西。需要动态分配(初始化)静态变量

我需要每一个函数被调用时的内容添加到字符串。我试着用

static char *result = (char*)calloc(0, sizeof(char)); 

但这种方式我:

error: initializer element is not constant

这是有道理的,但我真的不知道如何做到这一点不同(试图用全局变量也,但没有成功) 。

任何人都可以帮忙吗?

静态初始化必须是恒定的,因为你的错误消息指示。

指定它NULL,然后在其他一些功能,如果测试是NULL,分配其所需的资源(部分通情达理的默认设置),并从那里走。确保在完成后清理干净,如果这是一个线程环境,我建议你采用不同的方式将其存储在其他存储中,随时随地传送。

我已经看到了这样做的最常见的方式是初始化指针为NULL,和存储长度 - 可选的结束指针存储。当函数被调用时,检查缓冲区是否有足够的空间,如果没有,则重新分配内存块。通常你不想每次重新分配,而是增加一些固定的数量(通常根据系统的内存对齐方式选择),或者增加一倍以前的大小(一定要确保你有足够的空闲空间!)。

#define MYDATA_GROW_AMOUNT (12345) //exploit memory alignment on your system 
... 
/* if the compiler supports it, consider using __thread__ here */ 
static /* __thread__ */ char *mydata  = NULL; 
static /* __thread__ */ char *mydata_end = NULL; 
static /* __thread__ */ size_t mydata_len = 0; 
... 
/* gcc? you might want to use 
     if(__builtin_expect((mydata_len < required_data_len),0)) 
    here instead */ 
if(mydata_len < required_data_len) 
{ 
    mydata_end = mydata + mydata_len; 
    mydata_len += MYDATA_GROW_AMOUNT; 
    mydata = realloc(mydata,mydata_len); 
} 
... 

如果您需要增加数组长度,请改用realloc。


char *buf = NULL; 

while(/* some loop here */){ 
    buf = realloc(buf, sizeof(/* new content */)); 
    ... // copy your new content to buf here 
} 

如果您只添加内容,或许更好地使用列表呢?

+0

-1假定realloc(buf,...)在原地发生。 – 2011-03-08 12:50:39

+0

@Jim Balter请解释这里有什么问题? – 2011-03-12 12:01:39

+0

@S。我非常明确地说过,你的代码假设realloc就地发生。但是realloc可能会重定位数据,在这种情况下'buf'将包含一个无效地址,访问它可能会导致程序崩溃。修复你的代码,我会删除我的downvote。 – 2011-03-12 12:12:38

我能够得到这个为“固定的”尺寸数组工作,即,长度可在运行时期间被定义,不编译时间。我创建了一个具有空指针本身A作为输入的函数,然后将其更改并返回。长度len是自定义运行时长:

char *malloc_char_array(char* &A, int len); 

然后调用该函数在数组初始化:

static char *result = malloc_char_array(result, 50); //test length of 50 

静态初始化只发生在第一次函数被调用,所以它的工作原理对于需要动态调整大小的数组非常有用(即在编译期间未定义),但在整个程序运行过程中仍然保持不变。

而分配的功能将类似于:

char *malloc_char_array(char* &A, int len) 
{ 
    A = (char*) malloc(len * sizeof(char)); 
    return A; 
} 

使用这种方法没有必要释放“静态”分配的内存,就让它留在堆栈中,直到程序退出。