[英]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.