需要动态分配(初始化)静态变量
我需要在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
}
如果您只添加内容,或许更好地使用列表呢?
我能够得到这个为“固定的”尺寸数组工作,即,长度可在运行时期间被定义,不编译时间。我创建了一个具有空指针本身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;
}
使用这种方法没有必要释放“静态”分配的内存,就让它留在堆栈中,直到程序退出。
-1假定realloc(buf,...)在原地发生。 – 2011-03-08 12:50:39
@Jim Balter请解释这里有什么问题? – 2011-03-12 12:01:39
@S。我非常明确地说过,你的代码假设realloc就地发生。但是realloc可能会重定位数据,在这种情况下'buf'将包含一个无效地址,访问它可能会导致程序崩溃。修复你的代码,我会删除我的downvote。 – 2011-03-12 12:12:38