我需要在C靜態字符串(當量)可變的,我有麻煩實施類似的東西。需要動態分配(初始化)靜態變量
我需要每一個函數被調用時的內容添加到字符串。我試着用
static char *result = (char*)calloc(0, sizeof(char));
但這種方式我:
error: initializer element is not constant
這是有道理的,但我真的不知道如何做到這一點不同(試圖用全局變量也,但沒有成功) 。
任何人都可以幫忙嗎?
我需要在C靜態字符串(當量)可變的,我有麻煩實施類似的東西。需要動態分配(初始化)靜態變量
我需要每一個函數被調用時的內容添加到字符串。我試着用
static char *result = (char*)calloc(0, sizeof(char));
但這種方式我:
error: initializer element is not constant
這是有道理的,但我真的不知道如何做到這一點不同(試圖用全局變量也,但沒有成功) 。
任何人都可以幫忙嗎?
靜態初始化必須是恆定的,因爲你的錯誤消息指示。
指定它NULL
,然後在其他一些功能,如果測試是NULL,分配其所需的資源(部分通情達理的默認設置),並從那裏走。確保在完成後清理乾淨,如果這是一個線程環境,我建議你採用不同的方式將其存儲在其他存儲中,隨時隨地傳送。
我已經看到了這樣做的最常見的方式是初始化指針爲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);
}
...
如果您需要增加數組長度,請改用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;
}
使用這種方法沒有必要釋放「靜態」分配的內存,就讓它留在堆棧中,直到程序退出。
-1假定realloc(buf,...)在原地發生。 – 2011-03-08 12:50:39
@Jim Balter請解釋這裏有什麼問題? – 2011-03-12 12:01:39
@S。我非常明確地說過,你的代碼假設realloc就地發生。但是realloc可能會重定位數據,在這種情況下'buf'將包含一個無效地址,訪問它可能會導致程序崩潰。修復你的代碼,我會刪除我的downvote。 – 2011-03-12 12:12:38