[英]Need dynamically allocated (initialized) static variable
我在C中需要一个静态字符串(等效)变量,而在实现类似功能时遇到了麻烦。
每次调用该函数时,我都需要向该字符串添加内容。 我尝试过
static char *result = (char*)calloc(0, sizeof(char));
但是这样我得到了:
错误:初始化元素不是恒定的
这样做是有道理的,但是我真的不知道该怎么做(也尝试使用全局变量,但没有成功)。
有人可以帮忙吗?
如错误消息所示,静态初始值设定项必须为常数。
将其分配为NULL
,然后在其他函数中测试其是否为NULL,分配所需的资源(一些合理的默认值),然后从那里去。 确保完成后进行清理,如果这是线程环境,我建议您采用其他方法将其放置在其他存储中,以备不时之需。
如果需要增加数组长度,请改用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;
}
使用这种方法,无需释放“静态”分配的内存,只需将其保留在堆栈中,直到程序退出即可。
我见过的最常见的方法是初始化一个指向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);
}
...
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.