簡體   English   中英

需要動態分配(初始化)的靜態變量

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM