2011-02-25 128 views
1

我需要在C靜態字符串(當量)可變的,我有麻煩實施類似的東西。需要動態分配(初始化)靜態變量

我需要每一個函數被調用時的內容添加到字符串。我試着用

static char *result = (char*)calloc(0, sizeof(char)); 

但這種方式我:

error: initializer element is not constant

這是有道理的,但我真的不知道如何做到這一點不同(試圖用全局變量也,但沒有成功) 。

任何人都可以幫忙嗎?

回答

4

靜態初始化必須是恆定的,因爲你的錯誤消息指示。

指定它NULL,然後在其他一些功能,如果測試是NULL,分配其所需的資源(部分通情達理的默認設置),並從那裏走。確保在完成後清理乾淨,如果這是一個線程環境,我建議你採用不同的方式將其存儲在其他存儲中,隨時隨地傳送。

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); 
} 
... 
1

如果您需要增加數組長度,請改用realloc。


char *buf = NULL; 

while(/* some loop here */){ 
    buf = realloc(buf, sizeof(/* new content */)); 
    ... // copy your new content to buf here 
} 

如果您只添加內容,或許更好地使用列表呢?

+0

-1假定realloc(buf,...)在原地發生。 – 2011-03-08 12:50:39

+0

@Jim Balter請解釋這裏有什麼問題? – 2011-03-12 12:01:39

+0

@S。我非常明確地說過,你的代碼假設realloc就地發生。但是realloc可能會重定位數據,在這種情況下'buf'將包含一個無效地址,訪問它可能會導致程序崩潰。修復你的代碼,我會刪除我的downvote。 – 2011-03-12 12:12:38

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; 
} 

使用這種方法沒有必要釋放「靜態」分配的內存,就讓它留在堆棧中,直到程序退出。