0

我該如何強制Realloc行爲像calloc? 例如:使Realloc的行爲像Calloc

我有以下結構:

typedef struct bucket0{ 
    int hashID; 
    Registry registry; 
}Bucket; 

typedef struct table0{ 
    int tSize; 
    int tElements; 
    Bucket** content; 
}Table; 

,我有下面的代碼,以成長表:

int grow(Table* table){ 
Bucket** tempPtr; 

//grow will add 1 to the number available buckets, and double it. 
table->tSize++; //add 1 
table->tSize *= 2; //double element 

if(!table->content){ 
    //table will be generated for the first time 
    table->content = (Bucket**)(calloc(sizeof(Bucket*), table->tSize)); 
} else { 
    //realloc content 
    tempPtr = (Bucket**)realloc(table->content, sizeof(Bucket)*table->tSize); 
    if(tempPtr){ 
     table->content = tempPtr; 
     return 0; 
    }else{ 
     return 1000;//table could not grow 
    } 
    } 
} 

當我執行它,表正常增長,並且其中的「桶」的大部分被初始化爲NULL ptr。但是,並不是所有的都是。

我該如何讓Realloc的行爲像calloc?當它創建新的「桶」時,它們初始化爲NULL

+0

Call :: memset清除實時存儲器的額外部分? – Mine

回答

0

嚴格地說,您不應該依靠calloc(或memset)來設置指針爲空。空指針由內存中的全零字節表示。

comp.lang.C FAQ question 7.31報價:

不要依靠calloc的零填充過多(見下文);通常,最好自己初始化數據結構,尤其是在存在指針字段的情況下。

calloc的零填充爲全零位,因此保證爲所有整型(包括字符類型的'\0')產生值0。但它確實有而不是保證有用的空指針值(請參見該列表的5部分)或浮點零值。

自己初始化單個結構域比較安全。您可以創建一個作爲模板的static const,其content初始化爲NULL,然後memcpy將其分配給動態分配數組的每個元素。