我在C中需要一个静态字符串(等效)变量,我在实现类似的东西时遇到了麻烦。
每次调用函数时,我都需要为该字符串添加内容。我试过
static char *result = (char*)calloc(0, sizeof(char));
但是那样我得到了:
错误:初始化元素不是 恒定
这是有道理的,但我真的不知道如何做到这一点(尝试使用全局变量,但没有成功)。
任何人都可以提供帮助吗?
答案 0 :(得分:4)
静态初始值设定项必须是常量,如错误消息所示。
分配它NULL
,然后在其他一些函数中,测试它是否为NULL,分配它需要的资源(一些合理的默认值)并从那里开始。确保在完成后进行清理,如果这是一个线程化的环境,我建议你采用不同的路线将其放在你需要的任何地方传递的其他存储中。
答案 1 :(得分:1)
如果需要增加数组长度,请改用realloc。
char *buf = NULL;
while(/* some loop here */){
buf = realloc(buf, sizeof(/* new content */));
... // copy your new content to buf here
}
如果您只添加内容,可能最好使用列表?
答案 2 :(得分:0)
我见过的最常见的方法是将指针初始化为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);
}
...
答案 3 :(得分:0)
我能够使这个工作用于“固定”大小的数组,即长度可以在运行时定义,而不是编译时间。我创建了一个函数,它将空指针本身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;
}
使用这种方法,不需要释放“静态”分配的内存,只需让它保留在堆栈中,直到程序退出。