使Realloc表现得像Calloc



我怎么能强迫Realloc行为像callloc ?例如:

我有以下结构体:

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

当我执行它时,表正常增长,并且其中的大多数"bucket"初始化为NULL ptr。然而,并不是所有的都是。

如何使Realloc表现得像calloc?当它创建新的"桶"时,它们初始化为NULL

严格来说,您不应该依赖calloc(或memset)将指针设置为null。C不保证空指针在内存中由全零字节表示。

引用自comp.lang.C FAQ问题7.31:

不要太依赖calloc的零填充(见下图);通常,最好自己逐个字段地初始化数据结构,特别是在有指针字段的情况下。

calloc的零填充是全位零,因此保证对所有整型(包括字符类型的'')产生值为0。但是不能保证有用的空指针值(参见本列表的第5节)或浮点零值。

自己初始化单个结构字段更安全。您可以创建一个static const作为模板,将其content初始化为NULL,然后将memcpy初始化为动态分配数组的每个元素。

最新更新