让Realloc表现得像Calloc

时间:2014-03-25 02:40:20

标签: dynamic initialization dynamic-memory-allocation 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
     }
   }
 }

当我执行它时,表格会正常生长,而且大多数情况下都是“桶”和“#34;在它中初始化为NULL ptr。但是,并非所有这些都是。

如何让Realloc表现得像calloc?从某种意义上说,当它创造新的"水桶"他们初始化为NULL

1 个答案:

答案 0 :(得分:0)

严格来说,您不应该依赖calloc(或memset来设置指针)。空指针的C doesn't guarantee由内存中的全零字节表示。

引用comp.lang.C FAQ question 7.31

  

不要过分依赖calloc的零填充(见下文);通常,最好在逐个字段的基础上自己初始化数据结构,尤其是在有指针字段的情况下。

     

calloc的零填充是全位 - 零,因此保证为所有整数类型(包括字符类型的'\0')产生值0。但它确实保证有用的空指针值(参见本列表的5部分)或浮点零值。

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